数据传输对象 - 在DTO或业务对象中进行映射?

时间:2012-04-24 13:53:45

标签: c# wcf dto data-transfer-objects

我有一个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)。

只是想知道是否有标准方式?

3 个答案:

答案 0 :(得分:11)

我认为这需要一个单独的类,因为BO和DTO都不应该关注他们转换到另一个类。

我个人使用automapper库进行对象转换。通过简单的转换,例如在您的示例中,映射在一行代码中完成,复杂的转换也很容易设置。

如果您想自己映射,您仍然可以使用扩展方法将映射实现与DTO和BO类分开。

答案 1 :(得分:1)

我会建议一个组件层。负责任地处理业务层和数据层之间的通信。在这种情况下,您可以使用它将DTO对象转换为Business Objects。

答案 2 :(得分:0)

你担心“不需要将业务对象暴露给DTO”似乎有点没有根据,除非你在访问公共属性时没有在你的代码中显示某些东西,即根本不是胆量。

顺便说一句,不是使用克隆方法,而是可以实现一个强制转换操作符:MSDN

这样你就可以做到: 人p =(人)myPersonDTO;