域模型工厂可以调用存储库吗?

时间:2013-05-06 19:36:15

标签: domain-driven-design factory

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

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

3 个答案:

答案 0 :(得分:2)

+1关于Factory OR 一个DomainService可以访问一个存储库的事实。

BUT

-1 on:

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

与我一起思考:如果企业现在决定默认供应商是另一个供应商,该怎么办?这是一项规则,需要改变您的业务吗?这需要改变你的工厂吗?那可以吗?

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

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

订单可能有一个构造函数,比如订单(供应商供应商) - >这将迫使na订购供应商。

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

但域名应该永远不会知道。在我看来,它不适合那里。

布鲁诺

答案 1 :(得分:1)

简单回答你的问题,简单来说就是。

答案 2 :(得分:0)

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

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

如果Aggregate构造足够复杂,值得拥有专用工厂,那么从工厂调用'Generate'是很自然的。