【问题标题】:Difference between Data transfer Object (DTO) & a dumb business object?数据传输对象 (DTO) 和哑业务对象之间的区别?
【发布时间】:2011-03-14 07:21:40
【问题描述】:

我在我的应用程序中使用了愚蠢的业务对象。刚刚使用 DTO 来传输对象的选定属性,但我想知道两者之间有什么区别?我找不到。

【问题讨论】:

    标签: c# asp.net architecture


    【解决方案1】:

    我想说唯一的区别是意图,假设您的愚蠢业务对象仅保持状态而没有行为。

    在这种情况下:

    • DTO 旨在在应用层之间传输数据
    • 哑业务对象是您的域模型的一部分

    【讨论】:

    • 实际上我使用了一个 DTO 来绑定一个有大约 30 个字段的对象,但我找不到我的 DTO 和 BO 本身之间的任何区别,只有更少的字段/属性。在这种情况下是否建议使用 DTO,因为我的项目现在有冗余?
    • @Popo - 完全由你决定。什么对您的应用程序有意义?您是否以相似的能力使用两者?他们有同样的责任吗? DTO 是否用于解耦?
    • 嗯,好的。我现在使用它们只是为了减少大型 BO 的内存浪费。还有一件事,如果你是我,你会为此目的使用 DTO 吗?
    • @Popo - 这实际上取决于应用程序的复杂性和分离关注点的需要。如果 BO 有大量不需要的数据(例如大的二进制字段),那么使用 DTO 来满足这种特定需求听起来是件好事。
    • 谢谢,需要专家确认。
    【解决方案2】:

    可能有点多余,但我已经输入了,嘿;)

    为了过度简化(很多),业务对象应该有 getter / setter 方法,而 DTO 应该只有属性。业务对象需要遵守您的业务规则,但 DTO 仅用于传输数据;它们不需要遵守任何规则,并且应该被设计为尽快将数据输入和输出。

    在像 PHP 这样的弱类型语言中,并不总是需要 DTO,因为可以动态地为通用对象赋予任意属性。不过,它们对于文档和强类型函数参数仍然很有用。

    【讨论】:

    • 感谢您的详细回复。我现在开始掌握窍门 =) 谢谢。
    • 在 C# 中,每个属性本质上是一个 getter/setter 对。在这方面,您的答案在 C# 领域没有多大意义。
    • @Oded:我认为答案是有道理的。我相信他的观点是业务对象应该控制 DTO 包含的数据。通过使用 getter 和 setter 方法而不是属性,调用者更有可能假设他们的数据正在被处理而不是简单地被存储。
    • @Justin:那样做——SetFoo(42) 而不是Foo = 42——不会是惯用的 C#。我唯一希望在编写良好的 C# 代码库中看到这一点的情况是,如果它是来自另一种语言的端口,作者希望在不同语言之间保持一致的 API。
    【解决方案3】:

    当您说“哑”业务对象时,实际上是在使这些对象与 DTO 相同。使业务对象成为业务对象的原因在于添加了验证和其他功能逻辑。当用户说业务对象需要 setter 和 getter 方法时,我不同意用户的“不”;他们可以很好地使用属性,他们只需要比任何一个都多。

    一个常见的观点是,应该允许业务对象保存无效值,并且只在尝试持久化到数据库时抛出异常,在这种情况下属性可以很好地工作。然而,大多数应用程序都希望在尝试发布到数据库之前向用户提供反馈。

    Rockford Lhotka 的 CSLA.NET 方法是在业务对象上使用IsValid() 方法,并使用一组已分配给对象本身的规则。还有其他方法可以解决这个问题,但关键是业务对象执行验证。正如您所怀疑的那样,“愚蠢的”业务对象实际上只是 DTO。

    【讨论】:

      猜你喜欢
      • 2013-03-25
      • 1970-01-01
      • 2023-03-30
      • 2010-11-28
      • 2011-03-09
      • 2011-10-22
      • 2023-03-03
      • 1970-01-01
      • 2017-03-11
      相关资源
      最近更新 更多