我正在尝试牙签DI库,我似乎错过了一些至关重要的东西。
我创建了以下test project on github,其中我尝试为我的理解问题提供尽可能小的用例。
在那里你会发现ApplicationModule我尝试在“root”模块中注入我需要的所有东西。正如您在那里看到的,我有两次scope.installModules(module)
,因为我的PlainPojo
取决于Application
实例。如果我没有进行第一次installModule
调用,我在范围内没有应用程序实例。正如评论中所提到的,我可以将应用程序实例作为参数传递,但我认为在使用DI时我可以删除它们吗?
导致麻烦的第二个类是SimpleTest类。如果我不在构造函数中调用inject()
方法,则不会注入PlainPojo成员。在绑定PlainPojo之后,我还尝试在installModules()
中第三次使用ApplicationModule
,但这没有帮助。
我错误地认为成员上的@Inject
足以在范围内可用时自动注入它,并且绑定的顺序足以使先前的绑定可用而无需在其间安装(就像在ApplicationModule
中完成的那样?)
如果我可以提供更多信息以使我的问题可以理解,请发表评论。
提前致谢!
答案 0 :(得分:2)
Toothpick只能在创建依赖对象本身的实例时自动注入依赖项(例如,它使用@Singleton注释,或者对该类有直接绑定)。
否则你必须手动调用Toothpick.inject,就像在SimpleTest中一样。当你调用PlainPojo的构造函数时,TP无法知道。
你可以使用
module.bind(PlainPojo.class);
module.bind(SimpleTest.class);
如果需要,也可以将它们作为单身人士。