我正在尝试牙签DI库,但我似乎错过了一些关键的东西。
我在 github 上创建了以下测试项目,我试图为我的理解问题创建一个尽可能小的用例。
在那里,您将找到应用程序模块,我尝试在"根"模块中注入我需要的所有内容。正如您在那里看到的,我有两次scope.installModules(module)
,因为我的PlainPojo
取决于Application
实例。如果我不执行第一个installModule
调用,则作用域中没有应用程序实例。如评论中所述,我可以将应用程序实例作为参数传递,但我认为在使用 DI 时可以删除它们?
引起麻烦的第二个类是 SimpleTest 类。如果我不在构造函数中调用inject()
方法,则不会注入 PlainPojo 成员。在绑定 PlainPojo 后,我还尝试第三次使用ApplicationModule
中的installModules()
,但这无济于事。
假设成员上的@Inject
足以在作用域中可用时自动注入它,并且绑定顺序足以使以前的绑定可用而无需在两者之间安装(如在ApplicationModule
中所做的那样),我是否错了?
如果我能提供更多内容以使我的问题易于理解,请发表评论。
提前感谢!
牙签只有在创建依赖对象本身的实例时才能自动注入依赖关系(例如,它用@Singleton注释或类有直接绑定)。
否则,您必须手动调用 Toothpick.inject,就像在 SimpleTest 中一样。TP 无法知道何时调用 PlainPojo 的构造函数。
你可以只使用
module.bind(PlainPojo.class);
module.bind(SimpleTest.class);
如果需要,可以将它们范围限定为单例。