6

我参与了一场关于域模型可见性的有趣辩论,并且想知道这里的人们是否有任何好的指导。

  • 根据我对 MDA 的理解,我们不需要在整个应用程序层和层中公开域模型
  • 原因是对域模型的任何更改都会对整个应用程序产生影响
  • 明智的做法是公开轻量级对象 (DTO),它们是域模型的一个小子集,以抽象出实际模型
  • 另一方面,对域模型的任何更改都意味着在整个应用程序中更改各种 DTO 以使更改可见,而如果我们确实公开域模型,则更改位于单个位置

希望看到一些关于此的评论和想法。

感谢所有的帮助!

4

3 回答 3

2

不,这不是 MDA 的意义所在。它是关于将自己与特定平台隔离开来,使用更高级别的符号(UML 及其动作语言)来指定系统的行为。

是否应该公开域模型取决于应用程序。对于经常使用该应用程序的用户(想想您的 IDE),域模型显然是公开的,您可以直接操作该域中的对象。但是对于偶尔使用的应用程序(想想机场的自助值机亭),应用程序应该引导用户完成工作流程。

即使您要屏蔽域对象,也不一定需要 DTO;这取决于域对象是否与呈现 UI 的层位于同一进程空间中。需要 DTO 的架构不太擅长适应新的需求,因为它们违反了 DRY 原则。

事实上,完全可以从直接暴露的领域对象构建企业应用程序;这是裸对象模式的目标。有几个开源框架可以实现这一点,包括原始的 Naked Objects Framework(在 Java 上)。.NET 也有一个商业等价物。

有关域对象的更多一般性讨论,我建议您查看 Evans 的书,域驱动设计。yahoo 上还有一个活跃的新闻组。

全面披露:我是 NOF for Java 的提交者,不直接参与 .NET 版本。

于 2010-05-05T05:44:31.123 回答
0

我同意丹。解决这个问题的一种方法是使用接口。您使您的公共方法返回您的域对象最初实现的接口。当您发现从应用程序返回域对象不再有效时,您需要引入 DTO 并实现相关接口。虽然您的库的内部结构现在已经改变,但任何使用的应用程序都不会受到影响。

于 2010-06-28T15:04:07.927 回答
0

我在这方面不是很了解,但我最近阅读了 Gojko Adzic 的这篇博客文章,我认为这很相关,关于 DTO 不一定是一个好主意,并且可以在不同的层上重复你的域模型,所以以免违反 DRY。

于 2010-07-02T11:21:04.377 回答