2013-02-11 64 views
0

我们可以将一个工厂上聚合根,密切参与产卵另一个对象的对象上,或者我们可以实现它作为一个服务(通常创建整个集合)。创建一个聚合的工厂应该放在哪里?

一)在大多数情况下,应该在哪里创建一个聚合根工厂放置(假设是有道理的创建只是而不是整个集合)?上根本本身?

b)同样,在这里应该在大多数情况下,一个工厂创建完整的总结放在哪里?

谢谢

+1

我不知道这是否有帮助,但在Java中,我将它们放在与它试图创建的类相同的包(.net名称空间)中,因为工厂和服务(在我看来)是领域模型。也许有些人更喜欢把工厂放在不同的包装中,但我认为这可能是一个风格问题。我总是把这些工厂放在不同的类中,因为他们的责任与他们正在创建的对象(构建对象与纯领域逻辑)的责任非常不同。 – Augusto 2013-02-11 19:48:29

+0

是的,我知道工厂属于域层 – user437291 2013-02-11 22:06:55

+1

我不认为有一套适用于所有情况的规则。它确实取决于您的域名和您想要实现的表达类型。您可以在聚合本身上创建构造函数方法,让外部类为您构建聚合,或者寻找服务来完成这项工作。在某些情况下,您可能想要防范不变量,而在其他情况下则不需要。重要的是,该域名表达了业务意图。 – stephenl 2013-02-11 22:54:26

回答

0

一)在大多数情况下,应该在哪里创建一个聚合根工厂放在(假设是有道理的创造不仅仅是根,而不是整个集合)?在根本身上?

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

b)同样,在大多数情况下应该在哪里设置一个用于创建完整Aggregate的工厂?

正在测试一个问题?

我发现验证静态(工厂)方法的行为是一个痛苦的考验。从本质上讲,你必须像遗留代码和重构一样对待你的代码,直到它是可测试的。但是,如果测试规定了代码,则不会遇到这样的问题。而不是使用工厂方法模式,而是使用抽象工厂来代替并依赖于其实例方法。所以,如果你把工厂放在一个指定的工厂对象内:为了创建复杂的聚集对象,我倾向于使用多个工厂对象。有一个聚合根工厂其他人都会谈。它利用工厂来制造骨料。通过这种方式,您不会将复杂的对象创建工作铲入单个工厂,随着您的代码库的发展,这种工厂常常会发生变化。相反,聚合根工厂取决于其他工厂做部件的初始化。

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

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