【发布时间】:2016-08-28 21:22:22
【问题描述】:
我读过的大部分内容(例如from the author)表明应该使用 AutoMapper 将实体映射到 DTO。它不应该从数据库中加载任何东西。
但是如果我有这个怎么办:
public class Customer {
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Order> Orders { get; set; }
}
public class CustomerDto {
public int Id { get; set; }
public string Name { get; set; }
public IEnumerable<int> OrderIds { get; set; } // here is the problem
}
我需要将 从 DTO 映射到实体(即从 CustomerDto 到 Customer),但首先我必须使用该外键列表从数据库中加载相应的实体。 AutoMapper 可以通过custom converter 做到这一点。
我同意这感觉不对...但是有什么替代方案?将该逻辑粘贴到控制器、服务、存储库、某个管理器类中?所有这一切似乎都在将逻辑推向其他地方,在同一层。如果我这样做,我还必须手动执行映射!
从 DDD 的角度来看,DTO 不应该是域的一部分。所以 AutoMapper 也不是域的一部分,因为它知道那个 DTO。所以 AutoMapper 与控制器、服务等处于同一层。
那么将 DTO 到实体的逻辑(包括访问数据库,并可能引发异常)放入 AutoMapper 映射是否有意义?
编辑
@ChrisSimon 下面的精彩回答从 DDD 的角度解释了为什么我不应该这样做。从非 DDD 的角度来看,是否有令人信服的理由不使用 AutoMapper 从数据库加载?
【问题讨论】:
-
PS 这不是一个主观问题。我想知道人们在这种情况下会做什么——我想知道我的选择。甚至作者也认为他的工具除了基本的对象到对象映射之外不应该用来做任何事情。
-
您的意思是 DTO - 实体映射还是其他方式?
-
@tomliversidge DTO-to-entity(但实体必须根据 DTO 中的 FK 从数据库加载其导航属性)
-
这里的业务流程是什么?为什么需要加载完整的订单对象?
-
@tomliversidge 客户端应用 POST 一个新的
CustomerDto到服务器,作为一个新的Customer实体插入到数据库中。但是该 DTO 包含导航属性的 FK (Order),因此必须先加载它们(并验证它们是否存在等),然后我才能插入父实体。
标签: c# entity-framework asp.net-web-api automapper