数据传输对象 - 在 DTO 或业务对象中执行映射
本文关键字:对象 执行 映射 业务 DTO 数据传输 | 更新日期: 2023-09-27 18:32:09
我有一个 WCF 服务,并且刚刚为业务对象创建了一个 DTO。
我的问题是将两者之间的映射放在哪里?
A) 在 DTO 中?
public class PersonDTO
{
[DataMember] public string Id { get; set; }
[DataMember] public string Name { get; set; }
public void CloneFrom(Person p)
{
Id = p.Id;
Name = p.Name;
}
public void Populate(Person p)
{
p.Id = Id;
p.Name = Name;
}
}
或
B) 在业务对象中?
public class Person
{
public string Id { get; set; }
public string Name { get; set; }
public void CloneFrom(PersonDTO dto)
{
Id = dto.Id;
Name = dto.Name;
}
public PersonDTO GetDTO()
{
return new PersonDTO()
{
Id = Id;
Name = Name;
}
}
}
我喜欢 A 中的关注点分离(业务对象不了解 DTO),但我更喜欢 B 的封装(无需向 DTO 公开业务对象胆量)。
只是想知道是否有标准方法?
我认为这需要一个单独的类,因为BO和DTO都不应该关心它们转换为另一个类。
我个人使用自动映射器库进行对象转换。对于简单的转换(如示例中所示),映射在一行代码中完成,复杂的转换也很容易设置。
如果要映射自己,仍可以使用扩展方法将映射实现与 DTO 和 BO 类分开。
我建议使用组件层。 它应该负责业务层和数据层之间的通信。 在这种情况下,您可以使用它将 DTO 对象转换为业务对象。
你担心"不需要向DTO公开业务对象胆量"似乎有点没有根据,除非你没有在代码中显示一些东西,因为你正在访问公共属性,即根本没有胆量。
顺便说一句,您可以实现一个强制转换运算符,而不是克隆方法:MSDN
这样,您可以执行以下操作:人员 p = (人)我的人物DTO;