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

时间:2012-12-19 17:38:45

标签: c# asp.net-mvc-3 model-view-controller design-patterns

初步情况:

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

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

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

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

2 个答案:

答案 0 :(得分:6)

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

  

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

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

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

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

ViewModel(或Model,取决于您的观点)是适合查看(在网页上显示)和绑定(从网页接收)之间的适配器 - 和简而言之,这两件事情往往会偏离业务逻辑层面使用的实际服务类型。事实上,他们应该,因为他们的目标是解决不同的问题。

答案 1 :(得分:1)

取决于您是否要从控制器隐藏MyService。

在您的示例中,它是可见的。如果您在同一模型上有一个方法,然后委托给MyService,那么它就不会。

隐藏它的好处是您可以在不影响视图和控制器层的情况下交换MyService for YourSevice。

至于没有型号。那你在哪里定义你的DTO?基本上MyService将是您的模型。

您也在假设模型到控制器的DTO一直都是相同的,即使添加至少一个其他层也是如此。

如果我是你,我会考虑这个假设......

相关问题