初步情况:
我想用分层架构构建一个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模块......?
答案 0 :(得分:6)
我总是在服务层的任何实际工作都在控制器中完成的基础上工作。
如果我在控制器中访问我的服务层,我根本不需要Model模块......?
不正确 - 非常不可能您的服务类型将具有,甚至 具有正确的形状和元数据(例如[Display]
或[DataType]
归因)或使其与MVC视图一起正常运行。对于给予视图的所有对象,您应该具有模型类型,即使它们是您的服务类型的一对一克隆 - 因为您将视图和控制器所需的数据与您的服务分开类型。
如果您尝试将视图直接绑定到服务类型,那么您将创建以下两种方案之一:
ViewModel
(或Model
,取决于您的观点)是适合查看(在网页上显示)和绑定(从网页接收)之间的适配器 - 和简而言之,这两件事情往往会偏离业务逻辑层面使用的实际服务类型。事实上,他们应该,因为他们的目标是解决不同的问题。
答案 1 :(得分:1)
取决于您是否要从控制器隐藏MyService。
在您的示例中,它是可见的。如果您在同一模型上有一个方法,然后委托给MyService,那么它就不会。
隐藏它的好处是您可以在不影响视图和控制器层的情况下交换MyService for YourSevice。
至于没有型号。那你在哪里定义你的DTO?基本上MyService将是您的模型。
您也在假设模型到控制器的DTO一直都是相同的,即使添加至少一个其他层也是如此。
如果我是你,我会考虑这个假设......