DDD - 域服务的聚合根持有参考

DDD - Aggregate Root holding reference for a domain service

我的聚合根为了 "save itself" 而持有域服务的引用而不持有对任何存储库的引用是否可以接受?

这背后的想法不是有一个代码像 myDomainService.UpdateOrAdd(myAggregateRoot) 的应用程序服务,而是像 myAggregateRoot.Update()

Is it acceptable that my aggregate root holds a reference for a domain service in order to "save itself" while not holding reference to any repository?

DDD 并没有真正的标准机构或类似机构,因此可接受 将是一个主观判断。

很奇怪 ,但是,如果您将其带入代码审查,我预计会有很多回击,仅仅是因为它与通常情况相反惯例。

常规方法是聚合根对象只是域模型中的一个实体,因此实现中的代码应该看起来像域代码,而不是基础结构代码。因此,保存聚合状态的责任通常分配给 存储库 ,而不是对象本身。

从应用程序的角度来看,你描述的代码几乎没有区别,可能看起来像

// TradeBook is the root of the aggregate
TradeBook book = repository.getById(...);
book.placeOrder(...)
book.update();

和更常见的拼写

TradeBook book = repository.getById(...);
book.placeOrder(...)
repository.save(book);

所以,最小惊奇原则;如果您遵循通常的模式,继承您的代码责任的开发人员将会更轻松。