Dagger 通过 Components 工作:具体来说,您向 Dagger 传递您想要或想要做的事情的列表(组件接口)以及您希望如何提供重要的依赖项(模块),然后 Dagger 会生成你想要的接口的实现。
您已经向我们展示了 Foo 及其依赖存储库,但如果您没有向我们展示组件,我猜您可能没有。此时您可以选择如何进行:您可以从 Dagger 组件中获取 Foo,也可以像往常一样创建 Foo,然后调用 inject(foo) 以注入特定的 Foo 实例及其所有 @Inject字段(包括您的存储库)。前者通常更适合制作简单的界面,但后者适用于您无法控制生命周期的对象(如 Android 的 Application、Activity、Fragment、Service 和其他类似对象)。
获取 Foo
如果你选择让 Dagger 创建你的 Foo,你需要为 Foo 和 Repository 创建一个@Inject-annotated 构造函数(甚至是一个空的),然后编写像这样的组件:
@Component public interface YourComponent {
Foo createFoo(); // Name this whatever you like; it's a factory because
// of its return type and lack of parameters.
}
太棒了!现在只要你有一个 YourComponent 的实现,你就可以创建一个 Foo 并注入它。你还没有写过实现,但如果你写了,它可能看起来像这样:
public YourComponentImpl implements YourComponent {
@Override public Foo createFoo() {
Foo foo = new Foo();
foo.repo = new Repository();
return foo;
}
}
但是,你不必写一个:Dagger 会在你compile the YourComponent interface with the Dagger compiler 时立即为你写一个与上面那个等价的,这意味着用javac 编译它将 Dagger 编译器指定为源代码处理器。 Dagger 作为一个注解处理器,它读取@Component 接口并生成一个名为 DaggerYourComponent 的类。之后,您可以通过调用静态方法DaggerYourComponent.create() 来获取一个实例,然后在该实例上调用yourComponent.createFoo(),否则您将调用new Foo()。
注入现有的 Foo
要注入,您遵循与上述类似的模式,除了您的方法应该采用一个参数(您现有的 Foo 实例),因此您不需要将 @Inject-annotated 构造函数添加到 Foo 因为 Dagger 没有永远不要建造一个。不过,你为 Repository 做,因为 Dagger 会创建它。
@Component public interface YourComponent {
void inject(Foo foo); // Name this whatever you like; it's a members injector
// because it takes exactly one argument.
}
这将允许您像上面一样调用DaggerYourComponent.create() 来创建组件,然后调用yourComponent.inject(foo) 将存储库注入到您注释的repo 字段中。
一旦您对 Dagger 更加熟悉,您就可以开始构建您所知道的内容并添加模块、使用 Provider<> 注入或添加范围以便重用实例而不是创建每次都有新的。更多信息请查看User's Guide。