我正在学习Dagger,我只是好奇。我明白如果我打算使用Field Injection,我必须有这样的东西:
@Singleton
@Component(modules={AppModule.class, NetModule.class})
public interface NetComponent {
void inject(MainActivity activity);
// void inject(MyFragment fragment);
}
我列出了将进行字段注入的类。
如果这个组件是其他组件的父组件,我必须有类似的东西:
@Component(modules={ServiceModule.class,
ContextModule.class,
SchedulerModule.class})
@Singleton
public interface SingletonComponent {
Context appContext();
CatTable catTable();
CatDao catDao();
CatMapper catMapper();
CatRepository catRepository();
CatService catService();
Retrofit retrofit();
DatabaseManager databaseManager();
@Named("MAIN") Scheduler mainThreadScheduler();
@Named("BACKGROUND") Scheduler backgroundThreadScheduler();
}
但如果我不打算做任何一个,我可以有类似的东西:
@Singleton
@Component(modules = arrayOf(DatabaseModule::class, AppModule::class,
ApiServiceModule::class))
interface AppComponent{
}
身体只是空的。
(我知道我可能需要现场注射或子组件,我只是想确定我没有遗漏任何东西)。
答案 0 :(得分:2)
完全空的组件(不扩展另一个接口)将毫无用处。组件将入口点定义到对象图中,因此完全没有任何方法,您无法对该对象做任何事情。您已列出成员注入方法,但您还可以包含子组件工厂方法和构建器和组件提供方法。
ObjectA getA(); // component provision method
void inject(B b); // members injection method, which can return void
C inject(C c); // ...or return the object it injects, for convenience
// You can also make a subcomponent getter, if you supply necessary module instances...
DSubcomponent createD(SomeModule module);
// or just return a builder.
ESubcomponent.Builder createEBuilder();
这一点尤为重要,因为Dagger只会生成可从Component接口访问的图形绑定代码。如果您有@Binds
或@Provides
ObjectF
,ObjectG
或ObjectH
,那么这些将不会成为Dagger实施的一部分,除非它们是可传递的从您放入组件界面的方法。
组件与依赖关系和子组件怎么样?依赖于ParentComponent的ChildComponent只能通过"组件提供方法访问可用的对象" (零arg getters),所以没有方法的组件仍然没用。您还可以提供一个接口(没有注释),然后将您的ParentComponent(或任何其他实现)传递给构建器。在任何情况下,可用对象都是在父组件的公共接口上列出的对象,这仍然排除了接口为空。
子组件与依赖于组件的组件不同,它们的代码与其父组件同时生成。这意味着你不必明确从父母那里继承的东西; Dagger可以推断父图中可用的内容。但是,作为其父级的一部分,子组件还需要来自父组件接口的引用,否则它们将无法生成。 (此引用可以是返回子组件的工厂方法,返回子组件构建器的方法,或者来自组件上的某些其他对象或成员注入的传递注入。)因此,即使在子组件的情况下,空组件仍然无用。