2010-07-10 61 views

回答

1

也许有点多余的部件之间传输数据,但我已经输入它如此嘿;)

为了简单化(很多),业务对象应该有getter/setter方法,DTO应该只有属性。业务对象需要遵守业务规则,但DTO仅用于传输数据;他们不需要遵守任何规则,应该尽可能快地设计出数据。

在像PHP这样的弱类型语言中,DTO并不总是必需的,因为可以随意为通用对象提供任意属性。尽管如此,它们仍然可以用于文档,并且可以使用强类型的函数参数。

+0

感谢您的详细回复。我现在开始掌握一些东西=)谢谢。 – 2010-07-10 17:55:58

+0

在C#中,每个属性本质上都是一个getter/setter对。在这方面,你的答案在C#领域没有多大意义。 – Oded 2010-07-10 18:12:04

+0

@Oded:我认为答案是有道理的。我相信他的观点是业务对象应该控制DTO包含的数据。通过使用getter和setter方法而不是属性,调用者更可能假设他们的数据正在被*处理*而不是简单地被存储。 – 2010-07-10 19:06:59

1

我只会说,唯一的区别是意图,假设你的哑巴业务对象只持有状态和没有行为。

在这种情况下:

  • DTO的旨在应用层
  • 哑业务对象是你的域模型
+0

其实我用DTO绑定了一个有30个字段的对象,但是我不能在我的DTO和BO本身之间找到任何区别的字段/属性。在这种情况下,DTO是否被推荐,因为我现在在项目中有冗余? – 2010-07-10 17:40:52

+0

@Popo - 完全取决于你。什么对您的应用程序有意义?你是否以相似的能力使用这两个?他们有相同的责任吗? DTO在那里解耦? – Oded 2010-07-10 17:44:11

+0

嗯,好的。我现在正在使用它们来减少大型BO的内存浪费。还有一件事,如果你是我,你会用DTO来达到这个目的吗? – 2010-07-10 17:49:39

2

当你说“愚蠢”的业务对象,你有效地使这些对象与DTO一样。使业务对象成为业务对象的是增加了验证和其他功能逻辑。当他说业务对象需要setter和getter方法时,我不同意用户“否”他们可以使用属性就好,他们只需要比任何一个更多。

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

罗克福德洛特卡的CSLA.NET方法是在业务对象上使用IsValid()方法,该方法具有一组已分配给对象本身的规则。还有其他方法可以解决这个问题,但关键是业务对象执行验证。正如你怀疑的那样,“愚蠢的”业务对象确实只是DTO。

相关问题