Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC3-参考哪个模块中的单独服务项目?_C#_Asp.net Mvc 3_Model View Controller_Design Patterns - Fatal编程技术网

C# MVC3-参考哪个模块中的单独服务项目?

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 ) {

初步情况:

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

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

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。