0

我们可以将工厂放置在Aggregate root上,放置在与生成另一个对象密切相关的对象上,或者我们可以将其实现为Service(通常创建整个 Aggregate)。

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

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

谢谢

4

1 回答 1

0

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

如果只创建 Aggregate 根对象本身有意义,请提供工厂方法。在我看来,大多数时候这只是分配内存和调用初始化例程([Foo fooWithBar:...]而不是[[Foo alloc] initWithBar:...]在 Objective-C 中)或使用带参数的构造函数(new Foo(...)例如在 Ruby 中)的静态便捷方法。

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

测试有问题吗?

我发现验证静态(工厂)方法的行为很难测试。本质上,您必须像对待遗留代码一样对待您的代码并进行重构,直到它可以测试为止。但是,如果测试规定了代码,您就不会遇到这样的问题。代替使用工厂方法模式,您将使用抽象工厂并依赖其实例方法。

所以,如果你把工厂放在一个指定的工厂对象里面:为了创建复杂的聚合对象,我倾向于使用多个工厂对象。那里有一个聚合根工厂,其他人都会与之交谈。它利用工厂制造聚合体的组件。这样一来,您就不会将复杂的对象创建集中到一个工厂中,该工厂随着代码库的发展而经常发生变化。相反,Aggregate Root Factory依赖于其他工厂来进行部件的初始化。

正如您的问题的评论者已经指出的那样,工厂应该放置在域层中。

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

于 2014-02-19T18:59:33.717 回答