2012-01-25 53 views
0

现在,我有一个沿着Models项目,Service项目,Utilities项目和几个Datastores项目的ASP MVC Web应用程序,这些项目充当一个或多个域模型的存储库。我对每一层的分离感到非常满意,但我坚持要从服务层返回到Web应用程序。什么从服务返回到ASP MVC网络应用程序?

例如,当用户尝试注册时,控制器会收到一个RegisterViewModel。个别部分(电子邮件,密码等)被发送到服务层,该服务层使用guid,status,createdate等来构造成员域对象,将其发送到存储库以存储并最终返回用于web应用的成员对象以重定向到/会员/ {GUID}。

但是,如果电子邮件已经存在,服务层应该如何通知Web应用程序?在更复杂的情况下,我可能需要检查多个域对象和业务规则的存在/有效性,因此必须一次返回多个错误。另外,我不希望异常情况冒泡到Web层,因此服务层会捕获所有异常,但需要通知Web层某些方面。

即使我找到一种方法来返回所有这些,Web层将负担处理所有这些并为用户提供各种反馈。控制器代码将是庞大的和错误修剪。演示文稿的服务结果是否有最佳做法?我应该消除单独的服务层并将代码放在控制器内部吗?任何想法都欢迎。

回答

0

我写的operation model库用于这一目的,它允许你写这样的代码:

public OperationResult Register(RegisterInput input) { 

    var errors = new ErrorBuilder(); 

    if (errors.NotValid(input) // Invoke DataAnnotations validation 
     || errors.Not(this.repo.FindUserByEmail(input.Email) == null, "Email '{0}' already exists.",() => input.Email)) 
     return errors; 

    // Do stuff 

    return HttpStatusCode.OK; 
} 

...并在控制器中的错误信息被复制到ModelState中:

[HttpPost] 
public ActionResult Register(RegisterInput input) { 

    var result = this.service.Register(input); 

    if (result.IsError) 
     return View().WithErrors(result); 

    // Do stuff 
} 

查看使用此模式编写的MvcAccount项目的源代码。

+0

感谢您的代码。我可能会做这样的事情,但也许为每个服务电话定制结果。 –

0

首先,您需要决定是否为分发目的而编写服务层。

如果不打算服务层分发到不同的处理/机器,

  1. 创建消息类
  2. 创建消息类的数组,并将其存储在 HttpContext.Items
  3. 现在在任何层中添加任何新的消息到该阵列
  4. 消耗它在视图/控制器

HttpContext.Items可用于请求的生命周期,您可以一直使用它来查看。

如果您使用DI框架,则可以通过使用每个生命周期对象的请求来实现相同的目标。

如果你想分发对象没有错误抛出你的服务层的异常。

+0

我不确定我希望我的服务层是否支持HttpContext,但您确实给了我以前没想过的可能性。谢谢! –

+0

HttpContext.Items只是一个容器,一直存在于请求的生命周期中。正如我在帖子中提到的,你可以使用任何容器。如果没有计划分发系统,为什么不使用httpcontext? – chandmk

相关问题