请原谅这里的任何无知,我对 DDD 相当陌生,所以要温柔。
我正在开发一个大型配置驱动的数据管理系统。该系统是通过在外部语法中指定配置片段(如业务规则、流程和验证)来构建的。假设语法是基于 Groovy 的 DSL 和 Drools 的集合体。
我喜欢 DDD 提供的简单理念,特别是将基础设施问题与领域的核心概念分开。
但是,由于系统的可配置性,我很难应用 DDD 的一些概念。行为(流程)、验证和业务规则都是在系统外部定义的。因此,域中的实体本质上没有自己的行为。相反,他们对“验证器”或“规则引擎”或“工作流引擎”很敏感。
我将用一个例子来澄清。假设我的系统管理公司的员工。不用想太多,您会想象我的域中有一个员工实体和一个公司实体。
在 DDD 之后,我试图模拟一个员工升职的场景。您可能会在 Employee 上看到一个名为promote (Employee.promote) 的新方法。我们可以有一个业务规则,表明一个员工不能在同一年内晋升两次(是的,这都是编造的)。因此,我可以有类似的东西:
public void promote( EmployeeLevel newLevel ) {
if ( hasBeenPromotedThisYear( this ) {
throw new InvalidPromotionException
好吧,在我正在使用此业务规则的应用程序中,将被外部化为规则引擎。在 DDD 之后,我可以执行以下操作:
if( promotionRules.isEligibleForPromotion(this)
将我的规则外化。但是,该系统比这更通用。“提升”操作本身通过外部配置定义为“进程”。因此,在编译时,我什至不知道我是否有可供该员工使用的“提升”操作。因此,从代码的角度来看,我的员工对象变得非常简单,将所有功能委托给配置。它可能看起来像:
public class Employee {
public void execute( Process process )
或者,
public class EmployeeProcess {
public void process( Employee employee )
我的问题是:DDD 在这个应用程序中是否有意义?我是否应该只对非 DDD 意义上的流程、验证、业务规则(规则引擎)的协作进行建模?
我喜欢 Onion 架构,并且可以使用 UI -> App Services -> Core -> Infrastructure 来保持良好的关注点分离。但核心可能是上面提到的合作者,而不是真正的“领域概念”。
我的一部分认为,在这种情况下,“领域概念”是验证器、处理器、业务规则,因为它们构成了我们在讨论系统时所谈论的无处不在的语言。在这种情况下,我将拥有没有实际行为的实体(大部分情况下),以及实现系统行为的处理器、验证器、规则引擎方面的域概念。
添加更多信息。鉴于我上面的问题,我正在努力寻找一个看起来像这样的解决方案:
org.example.app
org.example.domain - 员工 - 公司 - EmployeeLevel
org.example.domain.shared - 流程 - BusinessRule - 验证器
org.example.infrastructure
希望这个小片段能增加一点清晰度。
因此,Process、BusinessRule 和 Validator 概念将位于域内,但会根据系统所做的事情来支持域模型。