Asp.net mvc 将Automapper与数据库优先方法结合使用的体系结构

Asp.net mvc 将Automapper与数据库优先方法结合使用的体系结构,asp.net-mvc,entity-framework,asp.net-web-api,architecture,automapper-3,Asp.net Mvc,Entity Framework,Asp.net Web Api,Architecture,Automapper 3,我有以下解决方案结构 Solution ProductServiceApi Business DataAccess DTO Contract 我在数据访问层使用EntityFramework。它具有.edmx文件和实体类(例如产品)。我的域类位于DTO层(ProductDto)。我正在WebApiConfig.cs文件中创建地图。为了映射DTO和DataAccess层实体,我必须在ProductServiceApi中添加对DTO层和DataAccess层的引用 e.g. Mapp

我有以下解决方案结构

Solution 
 ProductServiceApi
 Business
 DataAccess
 DTO
 Contract
我在数据访问层使用EntityFramework。它具有.edmx文件和实体类(例如产品)。我的域类位于DTO层(ProductDto)。我正在WebApiConfig.cs文件中创建地图。为了映射DTO和DataAccess层实体,我必须在ProductServiceApi中添加对DTO层和DataAccess层的引用

e.g.  Mapper.CreateMap<ProductDto, Product>();
例如Mapper.CreateMap();
但我认为在我的ProductServiceApi中添加对dataAccess层的引用是个坏主意


我应该做些什么来避免这种情况?我是否应该在DTO层中添加一个引用自动映射器,并在那里映射DTO和实体?理想的解决方案是什么。我已经看过一些在线教程,但找不到合适的解决方案

我对这个问题准备了一个相当长的答案,但当我重新阅读时,我意识到我的答案只会误导你。所以这里有一个简短的答案:)

但我认为在我的ProductServiceApi中添加对dataAccess层的引用是个坏主意

  • 如果我怀疑
    ProductServiceApi
    是一个WebAPI项目,那么你真的不能(也不应该)做任何事情来避免这个问题;在本例中,它有效地充当了
    Automapper
    的*,为了做到这一点,它必须有对所有这些内容的引用,否则它无法为您组成对象映射

  • 从设计的角度来看,这完全没有问题 ; 您可以“顺其自然”并在单独的程序集中进行映射配置,但是
    ProductServiceApi
    必须通过关联引用该程序集,这意味着它仍然直接引用较低的层

因此,虽然我怀疑在您当前的设计中有一些事情需要注意,并且可以进一步讨论,但我不认为您对这个特定问题中概述的场景有任何问题:)

可能需要查看的事项示例
  • 您有一个单独的
    契约
    层,我认为它包含抽象……应该将其分为多个层,每个层都包含一组与系统某个部分相关的内聚抽象
  • 另外,在DTO层中定义域对象听起来有点奇怪
但这些是另一个问题的东西


*(我知道,组合根通常用于IoC库的上下文中,但在这种情况下,您正在组合类型之间的映射,这是一种IoC,因此我认为原则是相同的).

我对这个问题准备了一个相当长的答案,但当我重新阅读时,我意识到我的答案只会误导你。所以这里有一个简短的答案:)

但我认为在我的ProductServiceApi中添加对dataAccess层的引用是个坏主意

  • 如果我怀疑
    ProductServiceApi
    是一个WebAPI项目,那么你真的不能(也不应该)做任何事情来避免这个问题;在本例中,它有效地充当了
    Automapper
    的*,为了做到这一点,它必须有对所有这些内容的引用,否则它无法为您组成对象映射

  • 从设计的角度来看,这完全没有问题 ; 您可以“顺其自然”并在单独的程序集中进行映射配置,但是
    ProductServiceApi
    必须通过关联引用该程序集,这意味着它仍然直接引用较低的层

因此,虽然我怀疑在您当前的设计中有一些事情需要注意,并且可以进一步讨论,但我不认为您对这个特定问题中概述的场景有任何问题:)

可能需要查看的事项示例
  • 您有一个单独的
    契约
    层,我认为它包含抽象……应该将其分为多个层,每个层都包含一组与系统某个部分相关的内聚抽象
  • 另外,在DTO层中定义域对象听起来有点奇怪
但这些是另一个问题的东西

*(我知道,组合根通常用于IoC库的上下文中,但是在这种情况下,您正在组合类型之间的映射,这是一种IoC,因此我认为原则是相同的)