【问题标题】:Architecture to use Automapper with database first approach将 Automapper 与数据库优先方法一起使用的架构
【发布时间】:2016-03-02 17:37:03
【问题描述】:

我有以下解决方案结构。

Solution 
 ProductServiceApi
 Business
 DataAccess
 DTO
 Contract

我在 DataAccess 层使用 EntityFramework。它具有 .edmx 文件和实体类(例如 Product)。我在 DTO 层(ProductDto)中有我的域类。我正在 WebApiConfig.cs 文件中创建地图。要映射 DTO 和 DataAccess 层实体,我必须在 ProductServiceApi 中添加对 DTO 层和 DataAccess 层的引用。

e.g.  Mapper.CreateMap<ProductDto, Product>();

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

我应该怎么做才能避免这种情况?我应该在 DTO 层中添加参考自动映射器并在那里映射 dto 和实体吗?什么是理想的解决方案。我浏览了一些在线教程,但找不到合适的解决方案。

【问题讨论】:

    标签: asp.net-mvc entity-framework asp.net-web-api architecture automapper-3


    【解决方案1】:

    我已经为这个问题准备了很长的答案,但当我重新阅读它时,我突然意识到我的答案只会误导你。所以这里有一个更简短的答案:)

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

    • 如果我怀疑 ProductServiceApi 是一个 WebAPI 项目,那么你真的不能(也不应该)做任何事情来避免这种情况;在这种情况下,它实际上是在充当AutomapperComposition Root*,并且为了做到这一点,它必须引用所有这些东西 - 否则它无法为您组合对象映射。

    • 这完全没问题,从设计的角度来看根本不是问题 ;您可以“将罐子踢下去”并在单独的程序集中进行映射配置,但是ProductServiceApi 将不得不通过关联来引用该程序集的含义,它仍然直接引用较低的层。

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

    可能需要查看的示例

    • 您有一个 Contract 层,我认为它包含抽象...这应该分成多个层,每个层都包含一组与系统的一个部分相关的内聚抽象。
    • 另外,在 DTO 层中定义域对象听起来有点奇怪。

    但这些是另一个问题的事情......

    *(我知道 Composition Root 经常在 IoC 库的上下文中使用,但是在这种情况下,您正在组合类型之间的映射,这是一个一种 IoC,所以我认为原理是相同的)。

    【讨论】:

      猜你喜欢
      • 2017-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多