C# MVC3-参考哪个模块中的单独服务项目?
初步情况: 我想用分层架构构建一个MVC3应用程序。这些层就是持久性 层(存储库模式)、服务层和视图层。我还希望将实体映射到中的DTO 持久层,并将这些DTO传递给视图 在视图中,我希望通过使用MVC3 weapp应用MVC模式。现在我的问题是,我应该访问(引用)服务层的哪个模块、控制器或模型。 我总是在控制器中看到对服务层的引用,如下所示:C# MVC3-参考哪个模块中的单独服务项目?,c#,asp.net-mvc-3,model-view-controller,design-patterns,C#,Asp.net Mvc 3,Model View Controller,Design Patterns,初步情况: 我想用分层架构构建一个MVC3应用程序。这些层就是持久性 层(存储库模式)、服务层和视图层。我还希望将实体映射到中的DTO 持久层,并将这些DTO传递给视图 在视图中,我希望通过使用MVC3 weapp应用MVC模式。现在我的问题是,我应该访问(引用)服务层的哪个模块、控制器或模型。 我总是在控制器中看到对服务层的引用,如下所示: public class CustomerController { public ViewResult Details( int id ) {
public class CustomerController
{
public ViewResult Details( int id )
{
CustomerDTO customerDto = MyService.GetCustomerById();
return View( customerDto );
}
}
我不应该访问模型模块中的服务层吗?如果我在控制器中访问我的服务层,我根本不需要模型模块…?我总是在控制器中完成服务层的任何实际工作的基础上工作 如果我在控制器中访问我的服务层,我根本不需要模型模块 不正确-您的服务类型不太可能具有或甚至不应该具有正确的形状和元数据(例如
[Display]
或[DataType]
属性),也不太可能使它们在MVC视图中正常工作。您应该为提供给视图的所有对象设置一个模型类型,即使它们是您的服务类型的一对一克隆,因为这样您就可以将视图和控制器所需的数据与服务类型分开
如果您试图将视图直接绑定到服务类型,则您正在创建以下两种场景之一:
- 使更改视图和控制器代码变得更困难,因为来回发送的数据必须符合服务类型
- 使更改服务类型变得更加困难,因为这样做意味着更改每个视图
ViewModel
(或Model
,取决于您的观点)是您的适配器,用于查看(在网页上显示)和绑定(从网页接收)之间,这两种情况很简单,这两种情况通常会偏离业务逻辑级别使用的实际服务类型。事实上,他们应该这样做,因为他们的目标是解决不同的问题。取决于您是否想对控制器隐藏MyService
在您的示例中,它是可见的。如果您在模型上有一个同名的方法,然后委托给MyService,那么它就不会是
隐藏它的好处是,您可以用MyService交换您的服务,而不会影响视图和控制器层
至于没有模型。那么,您在哪里定义DTO呢?基本上我的服务就是你的模式
您还假设模型到控制器要查看的DTO始终是相同的,即使添加了至少一个其他层
如果我是你,我会仔细考虑这个假设…如果你已经有了服务层,你需要一个模型层吗?如果服务以您需要的格式返回,则无需添加额外代码。在这种情况下,您的服务层就是您的模型。好的,我的视图中不需要模型层,因为我有一个单独的服务层。但是,我会为每个视图创建视图模型。非常感谢,这听起来很合乎逻辑。我应该将数据从服务层(主要是DTO)映射到控制器中的模型对象(ViewModel),对吗?对于这个建议,您建议实现一种映射器类吗?或者您可以使用构造函数来实现它——要么复制物理数据,要么简单地包装实例。一旦你有了分离,这取决于你如何映射它们。模型类是愚蠢的,因为它们不一定与服务层对话,但是当涉及到它们与服务类型的关系时,我通常是在它们都知道的基础上工作的,这样就不需要担心其他代码了。我在一个单独的项目中定义我的DTO,就像一个公共项目一样。但我认为现在很清楚,我不能从服务层到控制器再到视图使用DTO。