如何避免贫血的域层,仍然具有丰富的验证和业务规则

时间:2008-10-07 10:41:57

标签: domain-driven-design

如果您有一个域对象,并且您想要做一些有用的事情并且对该域对象负责,例如确保它是有效的,那么您有时需要访问相关对象的状态才能执行此验证。

如何避免需要调用存储库或数据访问层的域对象?由于性能的原因,即使使用延迟加载,也无法始终遍历集合关系,并且您经常希望在域对象中执行查询。您可以依赖注入存储库实现到域中,但不是非常纯粹并且使测试复杂化。

我总是放松一些东西,并允许使用DI从域名访问存储库。我没有看到如何在复杂的应用程序中拥有一个“纯”域层的明显例子,这个层也不是贫血的,并且有一个服务/应用层来完成所有的咕噜声并弄乱应该是域对象的内部。

2 个答案:

答案 0 :(得分:12)

  • 如果对象是值对象,则为 应该是不可变的和有效的 施工期间。

  • 如果是对象 是一个根聚合,它是 自己的状态足以告诉你 如果它有效,你可以添加 一个验证方法,它 通过聚合级联。

  • 最后,我认为这是你的主要内容 关心,如果你需要访问 几个相关的对象(即 不在同一聚合中)以确保 其中一个是有效的,你 最终需要驱逐出这个 特定验证服务中的逻辑。

我真的认为将服务和存储库注入实体并不是最佳选择。创建专用服务似乎更合适,我不明白为什么它会导致你有贫血的域对象。

简而言之,如果您可以在不依赖服务或存储库的情况下验证对象状态,那么让对象在聚合根级别处理它。当您需要查询服务或存储库时,或者当您需要其他实体时,请强烈考虑将此逻辑移到对象之外。

答案 1 :(得分:1)

几个小时前我回答了类似的问题。答案包含一些指导,当我试图用逻辑和行为来丰富我的模型时,我会使用这些指导,而不会因为依赖于与技术相关的东西而变脏。 Having trouble putting real-world logic into the DDD domain layer

答案还链接到其他有用的资源。

祝你好运,随时给我发邮件或者向我询问有关DDD和避免贫血模型的信息。这是一个有趣的话题,人们倾向于以不同的方式解决这个问题。