gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:19:12 26 4
gpt4 key购买 nike

好的,我阅读了很多关于存储库模式的内容,包括 Fowler 的书。
我很清楚它是什么以及它做了什么,但是我还不太确定它是如何被工厂和/或域对象调用的。

我的理解是存储库应该像域对象的内存集合一样,而工厂是负责实例创建的类:new myDomainObject()
考虑到这一点,存储库显然需要对工厂的引用才能从数据源查询中创建新对象。
(存储库 -> 工厂)

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

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

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

那么在您看来,这些选项中哪个更好?还是有其他选择?

最佳答案

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

因此,等式中缺少的部分是充当存储库主要客户端的东西。

输入:应用程序服务

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

这意味着应用服务将使用存储库从数据库加载聚合,对其进行处理,然后确保更改被持久化(即提交事务)。

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

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

  • 工厂和存储库

    关于您对工厂和存储库之间关系的问题,我认为 this answer of mine也提供了您问题的答案。它的基本要点是:
  • 使用存储库中的工厂来避免重复聚合的实例化逻辑。
  • 确保从外部清楚概念,即不要将存储库看到的工厂的“重构接口(interface)”暴露给其​​他类。最好遵循 Interface Segregation Principle .

  • 使用域中的存储库

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

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

    关于repository - 域对象、工厂和存储库之间的依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34313207/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com