2013-05-06 66 views
1

在我们的DDD项目中,我们使用Factory来创建我们的初始聚合根模型'Order'。有一个业务规则,说新的订单有他们的供应商的Order.Supplier默认给一个特定的供应商。我们需要从数据库中提取默认供应商。域模型工厂可以调用存储库吗?

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

回答

1

对你的问题的简单回答是,简单地说是。

+0

谢谢。从技术上讲,对象初始化供应商时仍然有效,并且不设置默认值,我不确定这是否是正确的地方。 – user2354863 2013-05-06 20:51:57

+0

我倾向于倾向于让应用服务调用存储库并将所需数据传递到工厂。这可以减少耦合并增强SRP。 – eulerfx 2013-05-07 18:14:40

+1

不要分割头发,但我不会把它放在应用程序服务中,而是放在域服务中(如果不想在工厂中存储库的依赖项),那就体现了用例。但总而言之,我们现在正在谈论细节,个人经验和便利。 – 2013-05-07 18:26:49

0

它可以,还有一个非常特殊的情况,工厂需要来调用一个存储库。当通过ORM(NHibernate HiLo例如)生成的汇集身份信息库将暴露的方法像

class SomeRepository { 
    ... 
    Identity Generate(); 
    ... 
} 

如果总建设是复杂的,足以值得专门的工厂,很自然地从工厂叫“生成” 。

2

+1的事实厂一个的DomainService可以访问一个复位器。

-1:

我觉得这无关域在所有。我认为这是一个应用程序规则。

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

记住:域指向“我们在哪个业务”而不是“我们如何做生意”。

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

顺序可能有一个构造函数,说订单(供应商的供应商) - >这将迫使呐为了有一个供应商。

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

但该域名不应该知道它。它不适合我的观点。

布鲁诺