【问题标题】:Mapping between database entities and domain objects or DTO数据库实体与域对象或 DTO 之间的映射
【发布时间】:2018-04-10 07:26:00
【问题描述】:

我的数据库对象和域对象之间有一个复杂的映射逻辑。因此,我没有使用任何第三方库,例如 AutoMapper。我想知道什么是更好的代码设计:

选项 #1。将映射器抽象为 IServiceNameMapper 并作为依赖项注入 IServiceName

选项 #2。为数据库对象和域对象编写扩展方法以在它们之间进行转换。

我倾向于选项 #1,因为我得到了很好的关注点分离,其中映射逻辑从核心服务逻辑中抽象出来,并作为依赖项注入到服务中。这也使我能够在将来扩展或更改映射逻辑,而无需更改服务实现。

有什么想法吗?

【问题讨论】:

  • 郑重声明,复杂的映射逻辑并不是使用 AutoMapper 的原因。鉴于 AutoMapper 的所有扩展点,没有任何映射逻辑是 AutoMapper 无法处理的。您可以将 AutoMapper 指向自定义转换器/解析器,以获得真正奇特的东西,并且仍然使用它的一些约定。
  • 这个链接可能会给一些想法 - htmlhttps://ramesh-java-design-patterns.blogspot.in/2018/03/converter-pattern.html

标签: c# .net design-patterns architecture


【解决方案1】:

从纯粹的架构角度来看,选项 1 更好。然而,有时这可能是过度设计。例如,我没有兴趣将我的 DTO 与实体分开,所以我所做的只是接受 DTO 的构造函数中的实体或在 DTO 上创建 ToEntity() 方法并将映射保留在 DTO 中。理论上这很糟糕,因为 DTO 不能在不引入实体的情况下用于另一个项目,但实际上我估计我需要的风险非常低,因为 Silverlight 现在已经死了:) 除非你进行极端的单元测试我认为扩展方法很好。基本上唯一可能发生的问题是您的单元测试将同时测试方法和映射逻辑,并且您将无法编写仅测试方法的测试。大不了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 2021-10-28
    • 2018-09-13
    • 1970-01-01
    相关资源
    最近更新 更多