使用Automapper和数据库优先方法的架构

时间:2016-03-02 17:37:04

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

我有以下解决方案结构。

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和实体映射到那里吗?什么是理想的解决方案。我已经完成了一些在线教程,但找不到合适的解决方案。

1 个答案:

答案 0 :(得分:0)

我已经为这个问题准备了一个很长的答案,但是当我重读它时,我突然明白我的答案只会误导你。所以这是一个较短的答案:)

  

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

  • 如果我怀疑ProductServiceApi是一个WebAPI项目,那么你不能真的(而且不应该)做任何事情来避免这种情况;在这种情况下它是有效地充当Automapper的{​​{3}} *,并且为了它这样做,它必须引用所有这些东西 - 否则它不能为你构成对象映射

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

因此,虽然有些内容我怀疑您当前的设计需要注意并且可以进一步讨论,但我不认为您对此特定问题中概述的方案存在问题:)

可能需要查看的事项示例

  • 你有一个我认为包含抽象的Contract图层......这应该被拆分成多个图层,每个图层都包含一系列与系统某个部分相关的一组内容。
  • 此外,在DTO层中定义域对象听起来有点奇怪。

但这些是另一个问题......

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