2017-01-03 108 views
0

我目前正在设计和实施一个使用Domain Driven Design概念的框架。在DDD中,域模型实体可以访问其存储库吗?

我试图把Validation域模型层。

有时做验证需要访问数据库和查询它,作为一个例子:

"querying to check multiple column unique index" 

对于这一点,事实上,查询应该在库层的类来写的,它出来的那个域名实体需要在域模型层中引用其存储库接口,以便将验证完全置于域模型层中。

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

如果不好,那么应该如何处理这种情况?

我的意思是应该这样的验证方法移到repositoryApplication Service几层?如果是,是否可以将验证方法移到这些图层上?

或者作为域名服务可以访问存储库,我们应该创造domain servicesdomain model layer进行验证?

我们应该如何处理?

在此先感谢

+2

[实体访问存储库可以吗?](http://stackoverflow.com/questions/827670/is-it-ok-for-entities-to-access-repositories) – guillaume31

+0

@ guillaume31 I不要认为它与你提到的问题是一样的,我编辑了我的问题并添加了更多细节。任何解决方案将不胜感激! – Karamafrooz

+0

你需要检查什么不变?我们在谈论哪个聚合根源,为什么它有责任验证这种独特性? “检查多个列唯一索引”并不是一个域描述... – guillaume31

回答

2

我不知道这是确定域实体访问存储库?

不是真的 - 这会使你的组件之间的依赖性纠结。

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

因此,需要查询聚集边界之外的某个东西,这表明您的设计中存在一个缺陷(您尝试执行的约束不是“真实的”,聚合边界被绘制在错误的地方,等等)。

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

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

请注意,你有一个一致性的问题 - 其他一些总可以在您使用的是过时副本为“验证”自己的变化而改变位于远程数据。如果你的总体边界是正确的,那么在这里不一致的业务成本应该是“小”的。

关键要点是状态检索和状态验​​证是单独的关注点,并且要理解任何状态聚合不能控制都是陈旧的 - 在时间上分离检索和验证不会给您的新增竞争条件系统。因此,将数据检索留在应用程序组件中,将验证放在聚合中,并接受您使用过时数据的折衷。

+0

非常感谢。如果使用构造器注入将存储库实例从上层传递到域实体会怎样?就像它为域服务所做的一样。 – Karamafrooz