我想对具有下述结构的系统构建依赖注入的最佳方法提出一些建议和反馈。我正在使用Guice,因此更喜欢以其基于注释的声明为中心的解决方案,而不是基于XML的Spring样式配置。
考虑一组类似的对象Ball, Box, and Tube
,每个对象都依赖于Logger
,通过构造函数提供。 (这可能不重要,但是所有四个类都恰好是单例 - 应用程序,而不是四人组,变种。)
ToyChest
类负责创建和管理三个形状对象。除了创建形状对象之外,ToyChest
本身不依赖于Logger
。
ToyChest
类被实例化为Main
类中的应用程序单例。
我对在ToyChest
中构造形状的最佳方法感到困惑。我要么(1)需要访问已附加到Injector
绑定Module
的Guice Logger
实例到实现,要么(2)需要创建一个新的Injector
附加到右Module
。
(1)是通过向@Inject Injector injector
添加ToyChest
字段来完成的,但这感觉很奇怪,因为ToyChest
实际上没有任何直接的依赖关系 - 只有孩子的那些它实例化。
对于(2),我不确定如何传递适当的Module
。
我是否在正确的轨道上?有没有更好的方法来构建它?
这个question的答案提到了传递Provider
而不是直接使用Injector,但我不确定它应该如何工作。
编辑:
也许一个更简单的问题是:使用Guice时,构造形状对象的适当位置在哪里? ToyChest
会对它们进行一些配置,但我想它们可以在其他地方构建。 ToyChest
(作为管理它们的容器),而不是Main
,在我看来似乎是构建它们的合适位置。
答案 0 :(得分:3)
正确的方法是让guice构建你的依赖项。那就是创建和配置。
在您的情况下,您应该在Main
中构建一个注射器。从进样器获得ToyChest
。当您通过注入器获取ToyChest
时,它由guice管理,您可以依赖它来提供正确配置的所有依赖项。
在您的情况下,您可以在Provider<Ball>
中注入Provider<Box>
,ToyChest
等,并在需要时从提供商处检索实例。 ToyChest
不负责构建实例,只是为了使用它。如果您有插件架构,也可以查看MapBinder。
到目前为止,所有内容都由guice管理,因此形状可以在没有使用类知道的情况下注入记录器。
如果您要将一些运行时参数传递给新创建的形状实例,则可以使用AssistedInject。
只是一个提示:你不需要使用构造函数注入,你可以在字段或setter上进行注入,这简化了构造函数。