加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

域对象,工厂和存储库之间的依赖关系

发布时间:2020-12-14 00:50:37 所属栏目:百科 来源:网络整理
导读:好的,我读了很多关于存储库模式的东西,包括福勒的书. 我知道它是什么以及它做了什么,但是我不太确定它是如何被工厂和/或域对象调用的. 我所理解的是,存储库应该像域对象的内存中集合一样,而工厂是负责实例创建的类:new myDomainObject() 考虑到这一点,很明
好的,我读了很多关于存储库模式的东西,包括福勒的书.
我知道它是什么以及它做了什么,但是我不太确定它是如何被工厂和/或域对象调用的.

我所理解的是,存储库应该像域对象的内存中集合一样,而工厂是负责实例创建的类:new myDomainObject()

考虑到这一点,很明显存储库需要引用工厂来从数据源查询中创建新对象.
(存储库 – >工厂)

域对象还需要对工厂的引用才能创建新对象.

我的困境是当域对象想要检索现有对象时,它应该调用存储库还是工厂?
如果它直接调用存储库(Domain – > Repository – > Factory),那么它需要同时拥有对工厂和存储库的引用,这对我来说似乎太过分了,但它是不是很糟糕?

另一方面,如果它像factory.CreateObjectWithId(id)一样调用工厂,那么工厂必须只将调用重定向到存储库repository.GetById(id),这最后会调用同一工厂的另一个方法对象创建(如果它还没有在内存中)factory.CreateObject(数据集),这样就会导致循环引用:
域对象 – >工厂< - >存储库,这对我来说似乎不是一件好事.

那么在您看来哪些选项更好?或者还有其他选择吗?

你已经掌握了基础知识.您的误解似乎来自您假设域对象应该是存储库的主要客户端.情况并非如此,如果没有其他方法,您应该只从域对象访问存储库.尽量避免它.

因此,等式中缺失的部分是作为存储库的主要客户端的东西.

输入:应用程序服务

应用程序服务是包含用例逻辑(与域逻辑相对)的服务.它执行输入验证,实现访问管理,并负责事务控制.

这意味着应用服务将使用存储库从数据库加载聚合,对其执行某些操作,然后确保更改是持久的(即提交事务).

根据您使用的存储库样式,将聚合保存回DB会略有不同:

>对于集合式存储库,应用程序服务通常使用一个工作单元来跟踪和提交更改.
>使用命令样式的存储库,应用程序服务在对其执行业务操作后将聚合传递回存储库.

工厂和仓库

关于你关于工厂和存储库之间关系的问题,我认为this answer of mine也提供了你的问题的答案.它的基本要点是:

>使用存储库中的工厂来避免重复聚合的实例化逻辑.
>确保从外部清楚概念,即不要将存储库看到的工厂的“重构接口”暴露给其??他类.这最好通过遵循Interface Segregation Principle来实现.

使用域中的存储库

如果您经常需要从数据库中查询其他聚合以在域层中执行业务任务,则表明您的聚合边界可能是错误的.

当然,有些情况下聚合边界很好,并且所需的对象不能作为参数传递给域对象.在这种情况下,使用域中的存储库是有意义的.在执行此操作之前,请务必尝试其他方法.在任何情况下,只依赖于存储库接口,从不在具体的存储库实现上.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读