在DDD中,域模型实体是否可以访问其存储库?

时间:2017-01-03 19:51:52

标签: architecture domain-driven-design ddd-repositories

我目前正在使用Domain Driven Design概念设计和实现框架。

我正在尝试将Validation放在域模型层中。

有时,验证需要访问数据库并查询它,例如:

"querying to check multiple column unique index"

关于这个以及查询应该在存储库层类中编写的事实,结果是域实体需要在域模型层中引用它们的存储库接口,以便将验证完全放在域中模型层。

我想知道域实体是否可以访问存储库?

如果不行,那么应如何处理这种情况呢?

我的意思是这种验证方法应该转移到repository还是Application Service图层?如果是,可以将验证方法移到这些层吗?

或者,由于域名服务可以访问存储库,我们是否应该在domain services中创建domain model layer进行验证?

我们该如何应对呢?

提前致谢

1 个答案:

答案 0 :(得分:3)

  

我想知道域实体是否可以访问存储库?

不是 - 它会在您的组件之间创建依赖关系纠缠。

体系结构的期望是聚合在加载时具有保护其不变量所需的所有状态信息。参与修改聚合的任何其他状态都应作为参数传递。

因此,需要在聚合边界之外查询某些内容,这表明您的设计存在缺陷(您试图强制执行的约束不是"真实",绘制聚合边界在错误的地方,等等。)

使用域服务来支持聚合所需的查询比直接连接到存储库更好,但不是更好。域模型应该与环境隔离,但引入域服务(或存储库)以支持验证会将域模型绑定到流程边界。

一个可以满足您需求的可接受的替代方案是让应用程序从存储库中获取必要的数据,然后将该数据的表示(或提供对该数据的访问的域服务)传递给聚合,然后可以将其用于"验证"。

请注意,您存在一致性问题 - 某些其他聚合可能正在更改远程数据,而您正在使用它的过时副本来验证"你自己的改变。如果您的汇总边界是正确的,那么此处不一致的业务成本应为"小"。

关键要点是状态检索和状态验​​证是单独的问题,并且理解聚合不控制的任何状态必然是陈旧的 - 及时分离检索和验证并不会增加新的竞争条件你的系统。因此,将数据检索保留在应用程序组件中,将验证放在聚合中,并接受使用过时数据的权衡。