witskeeper / geektime

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

关于DDD的一些疑问。

StephenYjw opened this issue · comments

在Ordering 微服务demo中,CMD Handler在Application层调用仓储repo并提交事务,只是最基本的create 操作。而在大多数业务场景中,会有更复杂的业务逻辑,比如验证唯一性或者复杂计算甚至跨聚合的一些查询,这些也在App层的CMD Handler中实现吗?如果将这些核心领域逻辑代码放到App层,DDD分层不就会慢慢变成传统的三层架构模型了么?DDD 中 Domain层包含聚合,充血模型的实体,领域事件,仓储以及领域服务,但是课程中并没有提到领域服务。希望老师为我解惑~~

你可以把命令处理器当作以前传统方式的应用Service,它是应用服务层,并不包含领域逻辑的,所有的领域逻辑都封装在Domain层,至于命令处理器放在WebApi中还是单独定义成类库,这得看你实际的业务需要,如果存在公共使用的应用服务,则可以定义成类库,供多个应用程序使用,但这种场景应该很少。
领域服务也属于领域概念,属于领域层,和应用服务是完全不同的。领域服务主要用于协调多个实体完成相应的业务逻辑情况,而这部分逻辑因不能放入任何实体,所以可以定义一个领域服务来完成,最典型的场景举例是:转账服务,因为转账涉及两个实体账户,每个实体只负责入账和出账方法,但并不能完成转账方法,所以需要领域服务来协调这两者完成转账功能。
还有在设计聚合根时,采用的尽可能设计小的聚合根,具体以业务用例操作的不变条件为依据。聚合根与聚合根之间的引用也通过引用聚合根Id的方式,而不是直接引用对象。如果在完成某业务用例的确需要其他聚合根,可以通过在应用层加载其他聚合根,再传入参数的方式给对应的方法。