13

如果你有一个域对象,并且你想做一些有用的和对该域对象的核心责任的事情,比如确保它是有效的,你有时需要访问相关对象的状态来执行这个验证。

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

我总是放松一些事情,并允许使用 DI 从域访问存储库。我没有看到如何在一个复杂的应用程序中拥有一个“纯”域层的明确示例,它也不是贫血的,并且有一个服务/应用程序层来做所有的工作,并弄乱应该是域对象的内部结构。

4

2 回答 2

12
  • 如果对象是一个值对象,它应该是不可变的并且在构造过程中被验证。

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

  • 最后,我认为这是您主要关心的问题,如果您需要访问多个相关对象(不在同一个聚合中)以确保其中一个有效,您肯定需要在特定的验证服务中删除此逻辑。

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

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

于 2008-10-07T11:12:49.747 回答
1

几个小时前我回答了一个类似的问题。答案包含我在尝试用逻辑和行为丰富我的模型时使用的一些指导,而不会使它因依赖于基础设施技术相关的东西而变得肮脏。 将现实世界的逻辑放入 DDD 领域层时遇到问题

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

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

于 2011-09-06T09:54:36.970 回答