我有一个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)。
只是想知道是否有标准方式?
答案 0 :(得分:11)
我认为这需要一个单独的类,因为BO和DTO都不应该关注他们转换到另一个类。
我个人使用automapper库进行对象转换。通过简单的转换,例如在您的示例中,映射在一行代码中完成,复杂的转换也很容易设置。
如果您想自己映射,您仍然可以使用扩展方法将映射实现与DTO和BO类分开。
答案 1 :(得分:1)
我会建议一个组件层。负责任地处理业务层和数据层之间的通信。在这种情况下,您可以使用它将DTO对象转换为Business Objects。
答案 2 :(得分:0)
你担心“不需要将业务对象暴露给DTO”似乎有点没有根据,除非你在访问公共属性时没有在你的代码中显示某些东西,即根本不是胆量。
顺便说一句,不是使用克隆方法,而是可以实现一个强制转换操作符:MSDN
这样你就可以做到: 人p =(人)myPersonDTO;