将 dto 包装在业务对象中 - 一个好主意?

Wrapping dto inside a business object - a good idea?

我们正在启动一个新的多层架构。过去我使用 AutoMapper 将数据传输对象映射到业务对象,反之亦然。一位同事建议,我们应该将 dto 包装在业务对象中,而不是映射。可能是通过在业务对象的构造函数中注入 dto。然后我们可以在没有映射的情况下动态访问 dto 的 属性 值。

问题:

是否推荐这种方法?

我知道如果业务对象知道 dto 就会引入紧耦合。此外,通过在业务对象和 dto 之间创建 1:1 关系,您失去了一些灵活性,通常 - 具有灵活的映射 - 将是 n:m 关系。

(参见:Best Practices For Mapping DTO to Domain Object?

这个缺点是似乎没有人使用包装方法的原因还是我错过了什么?

这是一个快速演示,我的意思是 "wrapping":

public class BusinessObject
{
    private Dto dto;

    public BusinessObject()
    {
        this.dto = new Dto();
    }

    public BusinessObject(Dto dto)
    {
        this.dto = dto;
    }


    public int Id
    {
        get { return dto.Id; }
        set { dto.Id = value; }
    }
}

public class Dto
{
    public int Id { get; set; }
}

感谢您的帮助!

托斯滕

这是一个有争议的问题。我第一次看到这种方法是在 blog post.

好处显而易见。它确实简化了您的代码。现在您的业务对象 (POCO) 不必重新创建一堆 DTO 已经涵盖的访问器和修改器,而是可以只引用 DTO 的属性。创建业务对象也更容易,因为您只需将 DTO 传递给业务对象构造函数,并且持久化业务对象现在更容易,因为您只需要获取对象的 DTO 部分。

这种方法有一些缺点。正如您所指出的,您现在或多或少被固定在 1-1 映射上。另一个缺点是您正在失去任何 validation or business logic 您的业务对象可能会强制执行您的对象的某些属性(因为 DTO 现在拥有它们)。

将 DTO 填充到业务对象 (POCO) 中的一个相当大的缺点是它可以在代码中留下对象往往不再管理其自身状态的行为。由于 expressed here,这会使定位负责特定功能的代码变得更加困难。这也使得使用 类 有点危险,因为对象的状态是在外部设置的。