MVC3 - 引用一个单独的服务项目在哪个模块?

Fab*_*ann 2 c# model-view-controller design-patterns asp.net-mvc-3

初步情况:

我想用分层架构构建一个MVC3应用程序.这些层将是持久层(存储库模式),服务层和视图层.我还想将实体映射到持久层中的DTO,并将这些DTO传递给View.

在View中我想通过使用MVC3 weapp来应用MVC模式.现在我的问题是,在哪个模块中,控制器或模型应该访问(引用)服务层.我总是在控制器中看到对服务层的引用,如下所示:

public class CustomerController
{
 public ViewResult Details( int id )
    {
       CustomerDTO customerDto = MyService.GetCustomerById();
       return View( customerDto );
    }
}
Run Code Online (Sandbox Code Playgroud)

我不应该访问Model模块中的服务层吗?如果我在控制器中访问我的服务层,我根本不需要Model模块......?

And*_*tan 6

我总是在服务层的任何实际工作在控制器中完成的基础上工作.

如果我在控制器中访问我的服务层,我根本不需要Model模块......?

不正确 - 您的服务类型不太可能具有,或者甚至应该具有正确的形状和元数据(例如[Display][DataType]归因),或者使它们与MVC视图一起正常工作.对于给予视图的所有对象,您应该具有模型类型,即使它们是您的服务类型的一对一克隆 - 因为您将视图和控制器所需的数据与您的服务分开类型.

如果您尝试将视图直接绑定到服务类型,那么您将创建以下两种方案之一:

  • 使得更改视图和控制器代码变得更加困难,因为来回发送的数据必须符合服务类型
  • 使更改服务类型变得更加困难,因为这样做意味着改变每个视图

ViewModel(或Model,取决于你的观点)之间有什么观看(显示在网页上)和绑定(从网页接收)不错适配器-它仅仅是这两个东西往往会从渐行渐远的情况下业务逻辑级别使用的实际服务类型.确实他们应该,因为他们的目标是解决不同的问题.