Dagger 2 Subcomponents for Encapsulation

不想你离开。 提交于 2020-01-15 05:33:11

问题


How do I add a Subcomponent to a Module with an argument constructor?

Adding code here in addition to providing a github link:

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";
    }
}

I tried to take a look at the dagger subcomponents documentation, specifically the section Subcomponents for encapsulation. I tried to create a code example to see if I could make it work, but with no luck. Am I missing something in the documentation? (There is a line of code commented out the @PrivateToDatabase which I am not sure what kind of annotation it is).

来源:https://stackoverflow.com/questions/54575509/dagger-2-subcomponents-for-encapsulation

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!