【发布时间】:2011-03-14 07:21:40
【问题描述】:
我在我的应用程序中使用了愚蠢的业务对象。刚刚使用 DTO 来传输对象的选定属性,但我想知道两者之间有什么区别?我找不到。
【问题讨论】:
标签: c# asp.net architecture
我在我的应用程序中使用了愚蠢的业务对象。刚刚使用 DTO 来传输对象的选定属性,但我想知道两者之间有什么区别?我找不到。
【问题讨论】:
标签: c# asp.net architecture
我想说唯一的区别是意图,假设您的愚蠢业务对象仅保持状态而没有行为。
在这种情况下:
【讨论】:
可能有点多余,但我已经输入了,嘿;)
为了过度简化(很多),业务对象应该有 getter / setter 方法,而 DTO 应该只有属性。业务对象需要遵守您的业务规则,但 DTO 仅用于传输数据;它们不需要遵守任何规则,并且应该被设计为尽快将数据输入和输出。
在像 PHP 这样的弱类型语言中,并不总是需要 DTO,因为可以动态地为通用对象赋予任意属性。不过,它们对于文档和强类型函数参数仍然很有用。
【讨论】:
SetFoo(42) 而不是Foo = 42——不会是惯用的 C#。我唯一希望在编写良好的 C# 代码库中看到这一点的情况是,如果它是来自另一种语言的端口,作者希望在不同语言之间保持一致的 API。
当您说“哑”业务对象时,实际上是在使这些对象与 DTO 相同。使业务对象成为业务对象的原因在于添加了验证和其他功能逻辑。当用户说业务对象需要 setter 和 getter 方法时,我不同意用户的“不”;他们可以很好地使用属性,他们只需要比任何一个都多。
一个常见的观点是,应该允许业务对象保存无效值,并且只在尝试持久化到数据库时抛出异常,在这种情况下属性可以很好地工作。然而,大多数应用程序都希望在尝试发布到数据库之前向用户提供反馈。
Rockford Lhotka 的 CSLA.NET 方法是在业务对象上使用IsValid() 方法,并使用一组已分配给对象本身的规则。还有其他方法可以解决这个问题,但关键是业务对象执行验证。正如您所怀疑的那样,“愚蠢的”业务对象实际上只是 DTO。
【讨论】: