Domain driven design 如何避免一个贫乏的领域层,仍然有丰富的验证和业务规则

Domain driven design 如何避免一个贫乏的领域层,仍然有丰富的验证和业务规则,domain-driven-design,Domain Driven Design,如果您有一个域对象,并且您想做一些对该域对象的责任非常重要的有用的事情,比如确保它是有效的,那么您有时需要访问相关对象的状态以执行此验证 如何避免域对象需要调用存储库或数据访问层?由于性能的原因,即使是延迟加载,也不能始终遍历集合关系,而且您通常希望在域对象中执行查询。您可以将依赖项注入存储库实现到域中,但这并不是纯粹的测试,也不会使测试复杂化 我一直很放松,允许使用DI从域访问存储库。我还没有看到过一个清晰的例子,说明如何在一个复杂的应用程序中拥有一个“纯”的域层,而这个应用程序也不是贫乏的,

如果您有一个域对象,并且您想做一些对该域对象的责任非常重要的有用的事情,比如确保它是有效的,那么您有时需要访问相关对象的状态以执行此验证

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

我一直很放松,允许使用DI从域访问存储库。我还没有看到过一个清晰的例子,说明如何在一个复杂的应用程序中拥有一个“纯”的域层,而这个应用程序也不是贫乏的,它有一个服务/应用程序层来处理域对象的所有内部事务。

  • 如果对象是值对象,则 应该是不可变的并经过验证的 施工期间

  • 如果对象 是根聚合,并且 自己的状态足以告诉你 如果有效或无效,您可以添加 关于它的验证方法 级联通过聚合

  • 最后,我认为这是你的主要任务 关注,如果您需要访问 几个相关对象(即 不在同一集合中)以确保 其中一个是有效的,你知道吗 确实需要驱逐这个 特定验证服务中的逻辑

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


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

< P>我在几个小时前回答了一个类似的问题。答案包含了一些我在尝试用逻辑和行为来丰富我的模型时使用的指导,而不会因为依赖于与基础技术相关的东西而弄脏它。

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


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

将对象注入实体是保持域层解耦的主要思想。在实体中注入存储库是最佳选择。你所说的专门服务是什么意思?仅当命令的上下文跨越多个实体时,才使用域服务。不应该有专门为实体提供的服务。“—(2x减)”