【问题标题】:Can a Domain Model Factory Call a Repository?域模型工厂可以调用存储库吗?
【发布时间】:2013-05-06 19:36:15
【问题描述】:

在我们的 DDD 项目中,我们使用工厂来创建我们的初始聚合根模型“订单”。有一条业务规则规定,新订单的供应商“Order.Supplier”默认为特定供应商。我们需要从数据库中获取默认供应商。

在创建初始订单时可以调用Order工厂中的供应商仓库获取默认值吗?我知道工厂的目的是在有效状态下创建模型。有效的新状态需要设置默认值。在这种情况下,我可以调用存储库还是应该将默认供应商传递给工厂构造函数?

【问题讨论】:

    标签: domain-driven-design factory


    【解决方案1】:

    +1 关于工厂 OR DomainService 可以访问存储库这一事实。

    但是

    -1 上:

    我认为这与域完全无关。我认为这是一个应用程序规则。

    和我一起想一想:如果企业现在决定默认供应商是另一个供应商怎么办?这是一个需要改变你的业务的规则吗?这需要改变你的工厂吗?可以吗?

    请记住:域指向“我们从事的业务”而不是“我们如何开展业务”。

    我宁愿把它放在 ApplicationService 上。域不需要知道是否有默认供应商。无论如何,它可能需要一个“供应商”。

    Order 可能有一个构造函数,比如 Order(Supplier supplier) - > 这将强制一个订单有一个供应商。

    或者工厂可能会在其方法中收到 DefaultSupplierId。

    但域永远不应该知道它。我认为它不适合那里。

    布鲁诺

    【讨论】:

      【解决方案2】:

      您的问题的简单答案是肯定的。

      【讨论】:

      • 谢谢。由于从技术上讲,该对象在初始化供应商并且不设置默认值时仍然有效,我不确定这是否是它的正确位置。
      • 我倾向于让应用服务调用存储库并将所需的数据传递给工厂。这可以减少耦合并提高 SRP。
      • 不要分叉,但我不会把它放在应用程序服务中,而是放在体现的域服务中(如果不想依赖工厂中的存储库)用例。但总而言之,我们现在谈论的是细节、个人经验和便利。
      【解决方案3】:

      可以,并且有一个非常特殊的情况,即工厂需要调用存储库。当 ORM 生成聚合标识时(例如NHibernate HiLo),存储库将公开一个类似

      的方法
      class SomeRepository {
          ...
          Identity Generate();
          ...
      }
      

      如果聚合构造足够复杂,值得拥有一个专门的工厂,那么从工厂调用“生成”是很自然的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-18
        • 2017-05-18
        • 1970-01-01
        • 2015-10-09
        • 2015-01-11
        • 2015-06-04
        • 1970-01-01
        相关资源
        最近更新 更多