【发布时间】:2015-05-17 22:04:59
【问题描述】:
我正在编写一个考虑 DDD 的应用程序,并试图通过将域逻辑和行为委托给实体来避免出现贫乏的域模型。在构建作为聚合根的实体并且需要创建需要由工厂类处理的子实体时,我遇到了一个问题。这是一个例子:
我有以下实体:Page、Url 和 Layout。在我的模型中创建页面的是 Page 与 Url 和 Layout - 如果没有这两个,Page 对象将无效。在一个简单的模型中,Page 构造函数方法将简单地将这两个对象创建为私有属性。但是,Url 有一个特定的要求;它必须从页面的标题(或 slug)创建,并且必须是唯一的(通过附加“-1”、“-2”或类似的东西来确保)。这需要与存储库进行通信。
我最初的想法是将UrlFactory 对象传递/注入到Page 构造函数并让Page 创建它需要的Url,但我一直在阅读关于如何将服务注入实体是一个坏主意.
所以,我的问题是;有没有一种方法——或一种既定的模式——允许实体在没有贫乏的域模型的情况下构建其复杂的子实体,或者在这种情况下注入工厂是一种有效的解决方案?
【问题讨论】:
-
并非所有东西都可以或应该进入实体。单一责任原则仍然适用。以下是您可以在应用程序服务中执行的操作:
url = urlGeneratorService.fromPageTitle(title); page = new Page(title, url, layout)。然后您的PageUrl值对象可以实现isDerivedFromTitle方法,并且在Page的构造函数中您可以执行...if (!url.isDerivedFromTitle(title)) throw ...。urlGeneratorService可以像new PageUrl(pageTitle, rawUrl)一样构造PageUrl。 -
反对将服务注入实体的论据是什么?可以提供网址吗?
标签: entity domain-driven-design factory anemic-domain-model