2

我想要一些关于为具有下述结构的系统构建依赖注入的最佳方法的建议和反馈。我正在使用 Guice,因此更喜欢以基于注释的声明为中心的解决方案,而不是重 XML 的 Spring 样式配置。

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

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

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

我对构建形状的最佳方法感到困惑ToyChest。我要么 (1) 需要访问已附加到实现绑定的 GuiceInjector实例,要么 (2) 需要创建一个附加到 right的新实例。ModuleLoggerInjectorModule

(1) 是通过向 中添加一个@Inject Injector injector字段来完成的ToyChest,但这感觉很奇怪,因为ToyChest实际上并没有任何直接依赖关系——只有它实例化的孩子的依赖关系。

对于 (2),我不确定如何传入适当的Module.

我在正确的轨道上吗?有没有更好的方法来构建它?

这个问题的答案提到传递 aProvider而不是直接使用 Injector ,但我不确定它应该如何工作。

编辑:

也许一个更简单的问题是:在使用 Guice 时,构造形状对象的合适位置在哪里? ToyChest将对它们进行一些配置,但我想它们可以在其他地方构建。 ToyChest(作为管理它们的容器),而不是Main,在我看来只是构建它们的合适位置。

4

1 回答 1

3

正确的方法是让 guice 构建您的依赖项。那就是创建和配置。

在您的情况下,您应该在Main. 从你得到的喷油器ToyChest。当您ToyChest通过注入器获取它时,它由 guice 管理,您可以依赖它来提供正确配置的所有依赖项。

在您的情况下,您可以注入Provider<Ball>,Provider<Box>等,ToyChest并且在需要时只需从提供程序中检索实例。ToyChest不负责构造实例,只是为了使用它。如果你有插件架构,你也可以检查MapBinder 。

到目前为止,一切都由 guice 管理,因此形状可以在使用类不知道的情况下注入它们的记录器。

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

只是一个提示:您不需要使用构造函数注入,您可以在字段或 setter 上进行注入,这简化了构造函数。

于 2011-11-23T22:02:29.693 回答