在Dagger2中,Component的主体是否可以为空?

时间:2017-11-23 16:47:31

标签: android dependency-injection dagger-2

我正在学习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{

 }

身体只是空的。

(我知道我可能需要现场注射或子组件,我只是想确定我没有遗漏任何东西)。

1 个答案:

答案 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 ObjectFObjectGObjectH,那么这些将不会成为Dagger实施的一部分,除非它们是可传递的从您放入组件界面的方法。

组件与依赖关系和子组件怎么样?依赖于ParentComponent的ChildComponent只能通过"组件提供方法访问可用的对象" (零arg getters),所以没有方法的组件仍然没用。您还可以提供一个接口(没有注释),然后将您的ParentComponent(或任何其他实现)传递给构建器。在任何情况下,可用对象都是在父组件的公共接口上列出的对象,这仍然排除了接口为空。

子组件与依赖于组件的组件不同,它们的代码与其父组件同时生成。这意味着你不必明确从父母那里继承的东西; Dagger可以推断父图中可用的内容。但是,作为其父级的一部分,子组件还需要来自父组件接口的引用,否则它们将无法生成。 (此引用可以是返回子组件的工厂方法,返回子组件构建器的方法,或者来自组件上的某些其他对象或成员注入的传递注入。)因此,即使在子组件的情况下,空组件仍然无用。