我目前正在从UI开始编写一个ASP.Net应用程序。我正在实现MVP架构,因为我厌倦了Winforms,并希望有一个更好的关注点分离的东西。
因此,在MVP中,Presenter处理由View引发的事件。这是一些我已经准备好以处理用户创建的代码:
public class CreateMemberPresenter
{
private ICreateMemberView view;
private IMemberTasks tasks;
public CreateMemberPresenter(ICreateMemberView view)
: this(view, new StubMemberTasks())
{
}
public CreateMemberPresenter(ICreateMemberView view, IMemberTasks tasks)
{
this.view = view;
this.tasks = tasks;
HookupEventHandlersTo(view);
}
private void HookupEventHandlersTo(ICreateMemberView view)
{
view.CreateMember += delegate { CreateMember(); };
}
private void CreateMember()
{
if (!view.IsValid)
return;
try
{
int newUserId;
tasks.CreateMember(view.NewMember, out newUserId);
view.NewUserCode = newUserId;
view.Notify(new NotificationDTO() { Type = NotificationType.Success });
}
catch(Exception e)
{
this.LogA().Message(string.Format("Error Creating User: {0}", e.Message));
view.Notify(new NotificationDTO() { Type = NotificationType.Failure, Message = "There was an error creating a new member" });
}
}
}
我已经使用内置的.Net验证控件完成了主要表单验证,但现在需要验证数据是否足够满足服务层的标准。
假设以下服务层消息可能会出现:
- 电子邮件帐户已存在(失败) - 输入的参考用户不存在(失败) - 密码长度超过数据存储允许的长度(失败) - 成功创建会员(成功)
还假设服务层将有更多规则,UI无法预见。
目前,如果事情没有按计划进行,我让服务层抛出异常。这是一个足够的策略吗?这段代码对你们来说有异味吗?如果我像这样编写服务层,您会因不得不编写以这种方式使用它的Presenter而感到烦恼吗?返回代码似乎太老套了,而布尔值则不够信息化。
非原作者编辑:将原作者的后续评论合并到答案中
Cheekysoft,我喜欢ServiceLayerException的概念。我已经为我不预料到的异常设置了全局异常模块。你觉得创建所有这些自定义异常很繁琐吗?我想捕获基本的Exception类有点不好,但不确定如何进一步处理。
tgmdbm,我喜欢那里聪明地使用lambda表达式!
感谢Cheekysoft的跟进。所以我猜如果你不介意用户显示一个单独的页面(我主要是Web开发人员),那么这将是策略,如果异常未被处理。
但是,如果我想在提交导致错误的数据的同一视图中返回错误消息,则必须在Presenter中捕获异常?
当Presenter处理ServiceLayerException时,CreateUserView的外观如下:
无论如何,我认为我们现在已经超出了我的原始问题的范围。我会尝试使用你发布的内容,如果我需要进一步的细节,我会发布一个新问题。