我的聚合根持有域服务的引用是否可接受,以便自己保存自己"而没有持有对任何存储库的引用?
这背后的想法是没有像myDomainService.UpdateOrAdd(myAggregateRoot)
这样的代码的应用程序服务,但像myAggregateRoot.Update()
答案 0 :(得分:2)
我的聚合根是否可以保留域服务的引用,以便在不保留对任何存储库的引用时“自行保存”?
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);
所以,最不惊讶的原则;如果您遵循通常的模式,那么继承您代码责任的开发人员将会更容易地使用它。