数据传输对象 - 在 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 公开业务对象胆量)。

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

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

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

我个人使用自动映射器库进行对象转换。对于简单的转换(如示例中所示),映射在一行代码中完成,复杂的转换也很容易设置。

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

我建议使用组件层。 它应该负责业务层和数据层之间的通信。 在这种情况下,您可以使用它将 DTO 对象转换为业务对象。

你担心"不需要向DTO公开业务对象胆量"似乎有点没有根据,除非你没有在代码中显示一些东西,因为你正在访问公共属性,即根本没有胆量。

顺便说一句,您可以实现一个强制转换运算符,而不是克隆方法:MSDN

这样,您可以执行以下操作:人员 p = (人)我的人物DTO;