我参与了一场关于域模型可见性的有趣辩论,并且想知道这里的人们是否有任何好的指导。
- 根据我对 MDA 的理解,我们不需要在整个应用程序层和层中公开域模型
- 原因是对域模型的任何更改都会对整个应用程序产生影响
- 明智的做法是公开轻量级对象 (DTO),它们是域模型的一个小子集,以抽象出实际模型
- 另一方面,对域模型的任何更改都意味着在整个应用程序中更改各种 DTO 以使更改可见,而如果我们确实公开域模型,则更改位于单个位置
希望看到一些关于此的评论和想法。
感谢所有的帮助!
我参与了一场关于域模型可见性的有趣辩论,并且想知道这里的人们是否有任何好的指导。
希望看到一些关于此的评论和想法。
感谢所有的帮助!
不,这不是 MDA 的意义所在。它是关于将自己与特定平台隔离开来,使用更高级别的符号(UML 及其动作语言)来指定系统的行为。
是否应该公开域模型取决于应用程序。对于经常使用该应用程序的用户(想想您的 IDE),域模型显然是公开的,您可以直接操作该域中的对象。但是对于偶尔使用的应用程序(想想机场的自助值机亭),应用程序应该引导用户完成工作流程。
即使您要屏蔽域对象,也不一定需要 DTO;这取决于域对象是否与呈现 UI 的层位于同一进程空间中。需要 DTO 的架构不太擅长适应新的需求,因为它们违反了 DRY 原则。
事实上,完全可以从直接暴露的领域对象构建企业应用程序;这是裸对象模式的目标。有几个开源框架可以实现这一点,包括原始的 Naked Objects Framework(在 Java 上)。.NET 也有一个商业等价物。
有关域对象的更多一般性讨论,我建议您查看 Evans 的书,域驱动设计。yahoo 上还有一个活跃的新闻组。
担
全面披露:我是 NOF for Java 的提交者,不直接参与 .NET 版本。
我同意丹。解决这个问题的一种方法是使用接口。您使您的公共方法返回您的域对象最初实现的接口。当您发现从应用程序返回域对象不再有效时,您需要引入 DTO 并实现相关接口。虽然您的库的内部结构现在已经改变,但任何使用的应用程序都不会受到影响。
我在这方面不是很了解,但我最近阅读了 Gojko Adzic 的这篇博客文章,我认为这很相关,关于 DTO 不一定是一个好主意,并且可以在不同的层上重复你的域模型,所以以免违反 DRY。