Guice 用户,试图在这里了解 Dagger 的一些好处。
假设我有以下内容
MyActivity.java
---------------
public class MyActivity {
@Inject MyImplicitClass myImplicitClass;
@Inject @Named("foo") MyExplicitClass myNamedExplicitClass;
...
}
MyImplicitClass.java
------------
public class MyImplicitClass {
@Inject
MyImplicitClass(MyExplicitClass myExplicitClass) {
...
}
...
}
MyModule.java
---------------
@Module(injects = { ? }) {
@Provides provideExplicitClass() {
return new MyExplicitClass();
}
@Named("foo") @Provides provideNamedExplicitClass() {
return new MyExplicitClass();
}
}
所以,我的问题是,Injects 中应该包含哪些内容?
我知道 MyActivity 需要去的事实。或者更确切地说,无论“这个”需要有 DaggerInjector.inject(this)
还有什么吗?
Dagger 隐式构造注入(inject)类 (MyImplicitClass) 和/或模块中显式提供的类 (MyExplicitClass) 是否也会被指定?
如果我需要对它进行注释,MyExplicitClass 甚至没有任何意义。
然而,javadoc 让我觉得我应该错误包含的一面
http://square.github.io/dagger/javadoc/dagger/Module.html#injects()
最佳答案
Dagger 1 在编译时进行验证,因此它需要您将在运行时使用的所有入口点(objectgraph.get(entrypoint)、objectgraph.inject(entrypoint))。
入口点是位于依赖图顶部的可注入(inject)类。在 Android 中,大多数时候这些是您的 Activity 、 fragment 、服务、广播接收器。所有不是由 Dagger 创建的组件。您还将列出不属于任何入口点的依赖树的一部分的类,这些类再次成为它们自己的入口点。
这些入口点用于通过 Dagger 进行验证。 Dagger 将在入口点开始验证,并沿着依赖树向下三步,并验证模块中用 @Inject 和 @Provides 注释的依赖项。
所以总而言之,@Module(injects = { * }) 中只需要提供入口点
在您的示例中,因为 MyImplicitClass 是入口点 MyActivity 的 @Inject 依赖项,所以您不需要在 @Modules(injects={}) 中指定它。您的 MyExplicitClass 依赖项也是如此。因此,从您的示例中,唯一需要添加到列表中的类实际上是 MyActivity。
根据您的示例代码,如果您有这样的东西。
// MyIndependantClass.java
-----------------
public class MyIndependantClass {
@Inject
MyIndependantClass(MyExplicitClass myExplicitClass) {
}
}
// MyActivity.java
---------------
public class MyActivity {
@Inject MyImplicitClass myImplicitClass;
@Inject @Named("foo") MyExplicitClass myNamedExplicitClass;
...
protected void onCreate (Bundle savedInstanceState) {
MyIndependantClass myIndependantClass = MyObjectGraph.get(MyIndependantClass.class);
...
}
}
MyIndependantClass 是使用 ObjectGraph.get() 创建的,并且不是 MyActivity 入口点的直接依赖项,因此您需要声明注入(inject)列表的该类部分。
// MyModule.java
---------------
@Module(injects = { MyActivity.class, MyIndependantClass.class }) {
@Provides provideExplicitClass() {
return new MyExplicitClass();
}
@Named("foo") @Provides provideNamedExplicitClass() {
return new MyExplicitClass();
}
}
关于android - Dagger @Module 中的 "injects"应该包含什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24328664/