可能对某些域逻辑实现实体需要访问repo以更新/删除self或任何相关实体。听起来不对吗?
答案 0 :(得分:6)
不,它没有,至少对于用“domain-driven-design”标记标记的问题。 当然,Active Record模式有权在某些系统中存在,有些人发现强耦合很有用,但在DDD中,建议的方法是明确使用存储库:
Evans DDD,第152页:对于需要全局访问的每种类型的对象,创建一个对象,该对象可以提供该类型的所有对象的内存中集合的错觉。 «...»仅为实际需要直接访问的AGGREGATE根提供存储。让客户专注于模型,委托所有对象存储和访问存储库。
因此,在DDD中,存储库不仅封装了访问数据库所需的基础结构代码,而且还包含了必须存储和加载对象的整个想法。
如果您正在执行一些涉及从数据库保存和加载的复合操作,那么引用存储库的服务是最佳候选者。
答案 1 :(得分:1)
虽然一个实体能够访问自己的存储库以存储或删除本身(参见persistence ignorance)肯定听起来很危险,但在某些特殊情况下,我可以容忍该实体来自存储库另一个聚合根的异常请求,它尚未持有对它的引用。
但是,请注意,域实体应该只知道存储库的抽象(即驻留在域层中的接口),而不是它们的具体实现。因此,不要让Domain层引用Infrastructure层,而是在您需要的地方注入具体存储库的实例。
无论如何,这不应该是常态。