2011-11-23 72 views
2

我想就如何为具有下述结构的系统构造依赖注入的最佳方法提出一些建议和反馈。我使用的是Guice,因此宁愿以基于注解的声明为中心的解决方案,而不是XML重型的Spring风格的配置。依赖注入的正确结构(使用Guice)

考虑一组类似的对象Ball, Box, and Tube,每个对象都依赖于Logger,通过构造函数提供。 (这可能并不重要,但所有四个类别碰巧都是单例 - 应用程序,而不是四人帮,多种。)

A ToyChest类负责创建和管理三个形状对象。 ToyChest本身不依赖于Logger,除了创建形状对象。

ToyChest类被实例化为Main类中的应用程序单例。

我对构建ToyChest中形状的最佳方法感到困惑。我要么(1)需要访问Guice Injector实例已附加到Module绑定Logger实施或(2)需要创建一个新的Injector附加到正确的Module

(1)通过添加@Inject Injector injectorToyChest完成,但这种感觉怪怪的,因为ToyChest实际上并没有任何直接的依赖---只有那些它实例的孩子。 (2),我不知道如何通过适当的Module

我在正确的轨道上吗?有没有更好的方法来构造这个?

对此question的回答提到通过Provider而不是直接使用喷射器,但我不确定应该如何工作。

编辑:

也许更简单的问题是:使用吉斯时,这里是构建形状的物体的适当位置? ToyChest会与他们做一些配置,但我想他们可以在别处构建。 ToyChest(作为管理它们的容器),而不是Main,在我看来,就像构建它们的适当位置。

+0

Ball,Box和Tube都是应用程序单例,但它们是由ToyChest创建的?你能澄清为什么需要这样吗? ToyChest可以在建造时分配给他们吗? –

+0

1)ToyChest决定创建哪个。 2)他们可以通过构造函数传递给ToyChest,但在其他地方不需要它们。这样(在我看来)会不必要地使构造者复杂化。还有一个全乌龟的问题。是什么使他们传递给ToyChest?也许通过构造函数传递它们是正确的,我只是没有看到更大的结构。 –

回答

3

正确的方法是让guice构造你的依赖关系。这是创建和配置。

在你的情况下,你应该在Main构建一个注入器。从注射器你得到ToyChest。当您通过由Guice管理的注入器获取ToyChest并且您可以依靠它来提供正确配置的所有依赖关系。

对于您的情况,您可以在ToyChest中注入Provider<Ball>,Provider<Box>等,并在需要时从供应商处检索实例。 ToyChest不负责构造实例,只是为了使用它。如果您有插件架构,您还可以检查MapBinder

到目前为止一切都是由guice管理的,所以这些形状可以让他们的记录器注入,而无需使用类知道它。

如果您有一些运行参数要传递给新创建的形状实例,则可以使用AssistedInject

只是一个提示:你不需要使用构造函数注入,你可以注入字段或设置器,这简化了构造函数。

+0

谢谢,这支持了我提出这个问题后得出的结论,并提出了一些其他的选择。 ToyChest需要通过构造函数/设置器来接受形状,或者接受从中获取形状的工厂/提供者/映射绑定者。我认为我的挂断是在颠倒我的控制权! –