Domain driven design 域模型可以知道存储库吗?

Domain driven design 域模型可以知道存储库吗?,domain-driven-design,ddd-repositories,Domain Driven Design,Ddd Repositories,可能是因为某些域逻辑实现实体需要访问repo以更新/删除自身或任何相关实体。这听起来正确吗?不,不正确,至少对于标有“域驱动设计”标签的问题来说是这样。 当然,活动记录模式有权在某些系统中使用,有些人认为强耦合很有用,但在DDD中,建议的方法是明确使用存储库: Evans DDD,第152页:对于需要全局访问的每种类型的对象,创建一个对象,该对象可以提供该类型所有对象的内存集合的错觉。«…»仅为实际需要直接访问的聚合根提供存储库。让客户机专注于模型,授权所有对象存储和对存储库的访问 因此,在DD

可能是因为某些域逻辑实现实体需要访问repo以更新/删除自身或任何相关实体。这听起来正确吗?

不,不正确,至少对于标有“域驱动设计”标签的问题来说是这样。 当然,活动记录模式有权在某些系统中使用,有些人认为强耦合很有用,但在DDD中,建议的方法是明确使用存储库:

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

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


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

虽然实体能够访问自己的存储库来存储或删除自己听起来很危险(请参阅),在某些特定情况下,我可以容忍一个实体例外地从存储库请求另一个它尚未持有引用的聚合根

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


无论如何,这不应该是正常现象。

谢谢Boris的回答,也许我应该进一步说明这个问题的来源,请看看这个解释我的情况的问题,让我知道你的想法,而且既然你提到了,我经常听到关于DDD的意见,说如果你使用的是普通的CRUD类型的应用程序,就不要使用DDD。我发现DDD的一些一般指导原则具有普遍性,无论我是否已经进化出一种“无处不在的语言”(我认为总是有一种UL,即使词汇表包含一些听起来相当技术性的术语,如插入、更新、删除-例如,我的领域专家实际上使用了这些术语:)@redzedi pein的答案很好,我只需要为实体引入一个Status(或State)字段,实体将有一个cancel()方法,该方法将其状态更改为CANCELLED,因为它与存储库CRUD方法无关。当然,当有人取消发票或使用Save()方法保存发票时,Evans在书中的某个地方指出,不存在使用书中所有实践的项目,所以你不能实现一个100%的ddd系统——这完全是平衡和常识的问题anyway@redzedi我看过你最近的文章,所以请检查一下,我不认为花太多精力来调整框架有什么好处,因为最终开发:-)总是有风险的