Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
Asp.net mvc 映射违反了DRY原则?如何在ASP.NET MVC应用程序中分离层_Asp.net Mvc_Entity Framework - Fatal编程技术网

Asp.net mvc 映射违反了DRY原则?如何在ASP.NET MVC应用程序中分离层

Asp.net mvc 映射违反了DRY原则?如何在ASP.NET MVC应用程序中分离层,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我是新ASP.NET MVC项目的唯一开发人员,因此我与同行讨论设计的能力有限。我想确保将来对我的应用程序的任何更改都只限于正在更改的层,这样整个应用程序就不必立即更改 我计划有3个层,每个层都在它自己的项目中,由数据层、服务/业务层和表示层组成 我的数据层将使用实体框架和通用存储库。该层将从repo方法返回实体类型 我的服务/业务层将很薄,但我希望将来有一个很好的单独的地方来存放业务逻辑。一开始,我的应用程序的每个主要领域都只提供服务类。ie EmployeeService提供与调用数据层的员

我是新ASP.NET MVC项目的唯一开发人员,因此我与同行讨论设计的能力有限。我想确保将来对我的应用程序的任何更改都只限于正在更改的层,这样整个应用程序就不必立即更改

我计划有3个层,每个层都在它自己的项目中,由数据层、服务/业务层和表示层组成

我的数据层将使用实体框架和通用存储库。该层将从repo方法返回实体类型

我的服务/业务层将很薄,但我希望将来有一个很好的单独的地方来存放业务逻辑。一开始,我的应用程序的每个主要领域都只提供服务类。ie EmployeeService提供与调用数据层的员工相关的CRUD方法。在某种程度上,我可能会用一个WebAPI服务层来代替它,并为许多客户机提供服务

我的表示层将是ASP.NET MVC,带有视图模型和强类型视图。今后可能会有更多的客户

我最感兴趣的是层和项目结构之间的通信。我最初的想法是使用AutoMapper将数据层实体映射到服务层业务对象/域对象或DTO,然后在演示文稿中再次映射到ViewModels。不过,开始时的映射大部分是1:1,因此感觉是多余的

拥有与实体类相同的DTO是否违反DRY?这是我知道如何与数据库结构解耦的唯一方法。理想情况下,如果更改数据库,我只需要更改实体和映射。也就是说,我完全重新安排了我存储东西的方式,我有了所有新的实体类/关系。。。我想将新的数据实现映射回相同的DTO和更高的层,这是我所不知道的

当从服务层映射到表示层时,同样的重复感觉也会出现。我的DTO将映射到ViewModels。基本上都是一样的,但我的想法是ViewModels还包含UI实现细节,如排序字段和特定于UI的类型,如SelectListItem


那么这实际上是重复还是感觉重复?有没有其他方法可以实现我在层中隔离更改的目标?我希望能够相对轻松地更改或替换表示层、服务层或数据层。

我建议找到一个可靠的(而且可靠的)开源MVC项目,并遵循这种模式。无需重新发明轮子--.NET MVC是健壮的,有很多项目遵循坚实的原则


看一看,您可以获得源代码,您将看到一个架构良好的应用程序,它回答了您的许多问题

尽管这个问题经过深思熟虑,但由于该网站的关注,它仍然可能遇到负面响应。不幸的是,像这样固执己见的问题并不是很合适,因为网站结构关注的是带有可验证答案的具体问题。在这种情况下,您可能会收到多个相互矛盾但同样正确的答案,这使得这个问题更适合于讨论论坛。那么我是否应该删除这个?我没有任何人可以讨论这些事情,所以这似乎是一个我可以邀请讨论的地方;我只是想给你一些反馈,为什么你会看到负面反应。如果你不回答这个问题,它很可能会被搁置。我已经改写了,试图问一个更具体的问题。所以我浏览了nopCommerce应用程序,它与我的计划非常相似。类似地,它也是MVC,使用服务层从实体框架顶部的存储库检索数据。但是它有用于数据的域类,这些域类也是实体类,因此反映了物理数据库。这些域对象由服务层返回并映射到控制器中的模型,这意味着表示层仍然与数据库结构耦合,不是吗?更改存储方式意味着我必须更改演示文稿:\存储库是将数据库与前端分离的地方。如果您有一个repo方法,该方法表示“GetCustomers”,并且返回了一个模型,那么您可以按照自己的意愿填充该模型,而您的表示层不会在意或知道。分离关注点…所以在某个地方仍然需要映射,对吗?从实体类到repo方法返回的域/业务/dto类。是。这就是域层的用途——它将不同的数据聚合/映射/转换为对表示层有意义的数据。难道不存在从域对象到视图模型的映射吗?比如,假设我有一个带有SelectList的视图,也许我的ViewModel有一个SelectListItem的集合。SelectListItem非常特定于该演示文稿,因此我认为在我的域对象中使用SelectListItem类型没有意义。所以我必须有一个从域对象到ViewModel的映射,对吗?这就是我在计划中将实体映射到DTO(实际上是域对象,不是吗?),然后将DTO映射到ViewModels时所做的。