领域模型可以知道存储库吗?

时间:2012-08-05 16:39:50

标签: domain-driven-design ddd-repositories

可能对某些域逻辑实现实体需要访问repo以更新/删除self或任何相关实体。听起来不对吗?

2 个答案:

答案 0 :(得分:6)

不,它没有,至少对于用“domain-driven-design”标记标记的问题。 当然,Active Record模式有权在某些系统中存在,有些人发现强耦合很有用,但在DDD中,建议的方法是明确使用存储库:

  

Evans DDD,第152页:对于需要全局访问的每种类型的对象,创建一个对象,该对象可以提供该类型的所有对象的内存中集合的错觉。 «...»仅为实际需要直接访问的AGGREGATE根提供存储。让客户专注于模型,委托所有对象存储和访问存储库。

因此,在DDD中,存储库不仅封装了访问数据库所需的基础结构代码,而且还包含了必须存储和加载对象的整个想法。

如果您正在执行一些涉及从数据库保存和加载的复合操作,那么引用存储库服务是最佳候选者。

答案 1 :(得分:1)

虽然一个实体能够访问自己的存储库以存储或删除本身(参见persistence ignorance)肯定听起来很危险,但在某些特殊情况下,我可以容忍该实体来自存储库另一个聚合根的异常请求,它尚未持有对它的引用。

但是,请注意,域实体应该只知道存储库的抽象(即驻留在域层中的接口),而不是它们的具体实现。因此,不要让Domain层引用Infrastructure层,而是在您需要的地方注入具体存储库的实例。

无论如何,这不应该是常态。