我有以下解决方案结构。
Solution
ProductServiceApi
Business
DataAccess
DTO
Contract
我在DataAccess层中使用EntityFramework。它具有.edmx文件和实体类(例如产品)。我在DTO层(ProductDto)中有我的域类。我正在WebApiConfig.cs文件中创建地图。为了映射 DTO 和 DataAccess 层实体,我必须在 ProductServiceAPI 中添加对 DTO 层和 DataAccess 层的引用。
e.g. Mapper.CreateMap<ProductDto, Product>();
但我认为在我的产品服务API中添加对dataAccess层的引用是一个坏主意。
我应该怎么做才能避免这种情况?我是否应该在 DTO 层中添加一个参考自动映射器并在那里映射 DTO 和实体?什么是理想的解决方案。我已经浏览了一些在线教程,但找不到合适的解决方案。
我已经为这个问题准备了一个相当长的答案,但当我重新阅读它时,我意识到我的答案只会误导你。所以这里有一个简短的答案:)
但我认为在我的产品服务API中添加对dataAccess层的引用是一个坏主意。
-
如果我怀疑
ProductServiceApi
是一个 WebAPI 项目,那么你真的不能(也不应该)做任何事情来避免这种情况;在这种情况下,它实际上是充当Automapper
的复合根*,为了做到这一点,它必须引用所有这些东西 - 否则它无法为你编写对象映射。 -
这完全没问题,从设计的角度来看根本不是问题;您可以"把罐子踢到路上"并在单独的程序集中进行映射配置,但是
ProductServiceApi
将不得不通过关联引用该程序集含义,它仍然直接引用较低层。
因此,虽然我怀疑在您当前的设计中有一些事情需要注意并且可以进一步讨论,但我认为您对这个特定问题中概述的场景没有问题:)
可能需要查看的事项示例
- 您有一个
Contract
层,我认为它包含抽象...这应该被分成多个层,每个层都包含一组与系统的一部分相关的有凝聚力的抽象。 - 此外,在DTO层中定义域对象听起来有点奇怪。
但这些是另一个问题的事情...
*(我知道组合根经常用于 IoC 库的上下文中,但在这种情况下,您正在编写类型之间的映射,这是一种 IoC,因此我认为原理是相同的)。