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

Gaz*_*yer 6 c# wcf data-transfer-objects dto

我有一个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;
    }
}
Run Code Online (Sandbox Code Playgroud)

要么

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我喜欢A中关注点的分离(业务对象不知道DTO),但我更喜欢B的封装(不需要将业务对象暴露给DTO).

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

Dir*_*eek 11

我认为这需要一个单独的课程,因为BO和DTO都不应该关注他们转变为另一个课程.

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

如果您想自己映射,您仍然可以使用扩展方法来保持映射实现与DTO和BO类分离.

  • @GazTheDestroyer:DTO用于数据传输而不是转换.DTO不应该意识到它的用法,即:映射.它传输数据,消费者可以将数据用于任何目的,例如:将其映射到ViewModel.您可以自由地向DTO添加映射,但我认为这意味着您错过了使用DTO的预期目的,因此您的DTO不再是DTO.在我们当前的项目中,存储库生成实体.BL接收实体,将它们映射到DTO.UI层查询BL,获取DTO并将它们映射到ViewModel(根据需要). (4认同)