我是一个新的 ASP.NET MVC项目的唯一开发人员,所以我与同行讨论设计的能力有限。我想确保将来对我的应用程序的任何更改仅限于要更改的图层,以便整个应用程序不必立即更改。
我计划有 3 层,每个层都在它自己的项目中,由数据层、服务/业务层和表示层组成。
我的数据层将使用实体框架和通用存储库。此层将从存储库方法返回实体类型。
我的服务/业务层会很薄,但我想要一个很好的单独位置来存储业务逻辑。一开始,它只不过是我的应用程序每个主要领域的服务类,即EmployeeService提供了与调用数据层的员工相关的CRUD方法。在某些时候,我可能会将其替换为 Web API 服务层并为许多客户端提供服务。
我的表示层将 ASP.NET MVC,具有ViewModels和强类型视图。未来,可能会有其他客户。
我最感兴趣的是层和项目结构之间的通信。我最初的想法是使用AutoMapper将数据层实体映射到服务层Business Objs/Domain Objs或DTO,然后在演示中再次映射到ViewModels。不过,一开始的映射主要是 1:1,所以感觉是多余的。
拥有与实体类相同的 DTO 是否违反 DRY?这是我知道如何与数据库结构分离的唯一方法。理想情况下,如果我进行数据库更改,我只想更改实体和映射。即,我完全重新排列了存储某些内容的方式,并且我拥有所有新的实体类/关系......我想将新的数据实现映射回相同的 DTO,而更高的层永远不会知道。
从服务层映射到表示层时,会出现相同的重复感。我的 DTO 将映射到 ViewModels。这基本上是相同的东西,但我的想法是ViewModels还包含UI实现细节,如排序字段和UI特定类型,如SelectListItem。
那么,这实际上是重复还是只是重复?有没有其他方法可以实现隔离层中更改的目标?我希望能够相对轻松地更改或替换表示、服务或数据层。
我建议找一个可靠的(和SOLID)的开源MVC项目并遵循该模式。 无需重新发明轮子-- .NET MVC是健壮的,并且有很多项目遵循SOLID原则。
看看NopCommerce,你可以得到源代码,你会看到一个架构良好的应用程序,可以回答你的许多问题。