创建聚合的工厂应该放在哪里?

时间:2013-02-11 19:08:58

标签: domain-driven-design

我们可以在聚合根上放置一个工厂,在一个与产生另一个对象密切相关的对象上,或者我们可以将它实现为 Service (通常会创建一个< em>整个聚合)。

a)在大多数情况下,应该在哪里放置一个用于创建聚合根的工厂(假设只创建 root 而不是是有意义的整个聚合)?在本身?

b)同样,在大多数情况下,应该在哪里放置 factory 来创建完整聚合

谢谢

1 个答案:

答案 0 :(得分:0)

  

a)在大多数情况下,应该在哪里放置用于创建聚合根的工厂(假设仅创建根而不是整个聚合是有意义的)?在根本身上?

如果仅创建聚合根对象本身,则提供工厂方法。在我看来,大部分时间这只是一种静态方便的方法,用于分配内存并在Objective-C中调用初始化例程([Foo fooWithBar:...]而不是[[Foo alloc] initWithBar:...])或使用带参数的构造函数({{例如,在Ruby中。}

  

b)同样,在大多数情况下,应该在何处放置用于创建完整聚合的工厂?

正在测试问题吗?

我发现验证静态(工厂)方法行为是一种难以测试的问题。从本质上讲,您必须将代码视为遗留代码和重构,直到它可测试为止。但是,如果测试决定了代码,那么你就不会遇到像这样的问题。您将使用抽象工厂而不是使用工厂方法模式,而是依赖其实例方法。

因此,如果将工厂放在指定的工厂对象中:要创建复杂的聚合对象,我倾向于使用多个工厂对象。其中一个聚合根工厂其他人都会与之交谈。它利用工厂生产集料的组件。这样,您就不会将复杂的对象创建转移到一个工厂中,随着代码库的发展,这个工厂很容易发生变化。相反,聚合根工厂依赖于其他工厂来进行部件的初始化。

工厂应该放在域层中,作为您已经指出的问题的评论者。

编辑:特别是当您从存储库重新构建聚合时,使用多个工厂会很有用。例如,如果放入深层嵌套的JSON,则只能测试工厂返回的对象。但是,如果您将子对象委托给其他工厂,那么您将能够(1)在测试中模拟它们,以及(2)验证聚合根工厂(i)调用它合作者与(ii)数据已经分开。

相关问题