知识卡片

领域层:实体与领域服务的分工,避免滥用领域服务导致贫血模型

普通读书笔记卡

内容

领域层是领域模型的核心,主要实现领域模型的核心业务逻辑,只关注领域对象或聚合自身的原子业务逻辑,不关心外部用户操作或流程这类易变的需求——这类需求交给应用层处理,这样设计能让领域模型不容易受外部需求变化影响,保持相对稳定。领域层的业务逻辑主要由实体和领域服务共同实现,但两者不在同一层级:实体采用充血模型,实现所有和自身相关的业务功能;当某个业务功能是单一实体(或值对象)自己无法完成的,需要组合协调聚合内多个实体或值对象时,领域服务才登场。书中特别提醒一个容易踩的坑:不要滥用领域服务——如果单一实体本该自己实现的业务行为,也被搬到领域服务里去做,实体就会退化成只剩数据、没有行为的空壳,整个模型不知不觉就从充血模型滑向了贫血模型。这条边界给出一个简单的自查方法:写一段业务逻辑之前先问自己,这段逻辑真的需要协调多个实体/值对象才能完成吗?如果答案是否,它就该留在对应的那个实体里,而不是顺手放进领域服务。

参考来源

- 位置:第10章《DDD分层架构》"10.1.3 领域层"(源文件:_epub-src/OEBPS/Text/chapter3-6-1-3.xhtml) - 结论依据:原文说明"当领域中的某些功能,如单一实体(或者值对象)不能实现时,这时领域服务就会出马,组合和协调聚合内的多个实体(或者值对象),实现复杂的业务逻辑……请记住不要滥用领域服务。如果单一实体自身的业务行为也用领域服务来实现,这样就很容易变成贫血模型",直接支撑本卡片结论。 - 原始内容:在选择用实体方法或者领域服务实现业务逻辑时,请记住不要滥用领域服务。如果单一实体自身的业务行为也用领域服务来实现,这样就很容易变成贫血模型。