Dagger 2封装子组件

时间:2019-02-07 14:24:10

标签: dagger-2

如何使用参数构造函数将子组件添加到模块中?

除了提供github链接外,在此处添加代码:

ExampleApplication.java

public class ExampleApplication extends DaggerApplication {

    @Inject
    Database database;

    @Override
    public void onCreate() {
        super.onCreate();
        Timber.plant(new Timber.DebugTree());

        Timber.i(database.name());

    }

    @Override
    protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
        return DaggerApplicationComponent
                .builder()
                .application(this)
                .build();
    }
}

ApplicationComponent.java

@ApplicationScope
@Component(modules = {
        ApplicationModule.class,
        AndroidSupportInjectionModule.class,
        ActivityBindingModule.class,
        DatabaseModule.class,

})
public interface ApplicationComponent extends AndroidInjector<ExampleApplication> {

    Database database();

    @Component.Builder
    interface Builder {

        @BindsInstance
        Builder application(Application application);
        ApplicationComponent build();
    }

    @Override
    void inject(ExampleApplication instance);
}

DatabaseModule.java

@Module(subcomponents = DatabaseComponent.class)
public class DatabaseModule {

    @Provides
    @ApplicationScope
    Database provideDatabase(
            @NumberOfCores int numberOfCores,
            DatabaseComponent.Builder databaseComponentBuilder) {
        return databaseComponentBuilder
                .databaseImplModule(new DatabaseImplModule(numberOfCores / 2))
                .build()
                .database();
    }
}

DatabaseComponent.java

@Subcomponent(modules = DatabaseImplModule.class)
public interface DatabaseComponent {

    // @PrivateToDatabase <- Is this a qualifier? A scope? Neither?
    Database database();

    @Subcomponent.Builder
    interface Builder {
        Builder databaseImplModule(DatabaseImplModule databaseImplModule);
        DatabaseComponent build();
    }

}

DatabaseImplModule.java

@Module
public class DatabaseImplModule {

    DatabaseImplModule(int concurrencyLevel) {}

    @Provides DatabaseConnectionPool provideDatabaseConnectionPool() {
        return new DatabaseConnectionPool();
    }
    @Provides DatabaseSchema provideDatabaseSchema() {
        return new DatabaseSchema();
    }
}

Database.java

public class Database {

    @Inject
    public Database() { }

    public String name() {
        return "I have a name";
    }
}

我试图看一下dagger subcomponents documentation,特别是用于封装的子组件部分。我试图创建一个code example 看看我能否使它工作,但是没有运气。我在文档中缺少什么吗? (有一行代码注释了@PrivateToDatabase,我不确定它是哪种注释。)

0 个答案:

没有答案