Dagger 2此示例中的构造函数注入

时间:2016-07-24 00:53:18

标签: android dependency-injection dagger-2

我认为我理解了依赖注入如何与Dagger 2一起工作,直到我在这里查看这个项目:https://github.com/saulmm/Avengers

public class CharacterDetailPresenter implements Presenter {

private final CharacterDetailsUsecase mGetCharacterInformationUsecase;

@Inject
public CharacterDetailPresenter(CharacterDetailsUsecase getCharacterInformationUsecase) {
    mGetCharacterInformationUsecase = getCharacterInformationUsecase;
}
}
//presenter methods

注入演示者的活动:

public class CharacterDetailActivity extends AppCompatActivity implements CharacterDetailView {

    @Inject CharacterDetailPresenter mCharacterDetailPresenter;

@Override
public void onCreate(Bundle savedInstanceState) {
    initializeDepedencyInjector();
    //
}

    private void initializeDependencyInjector() {

    AvengersApplication avengersApplication = (AvengersApplication) getApplication();

    int avengerId = getIntent().getIntExtra(EXTRA_CHARACTER_ID, -1);

    DaggerAvengerInformationComponent.builder()
        .activityModule(new ActivityModule(this))
        .appComponent(avengersApplication.getAppComponent())
        .avengerInformationModule(new AvengerInformationModule(avengerId))
        .build().inject(this);
    }
 //
}

有问题的模块。

@Module
public class AvengerInformationModule {
private final int mCharacterId;

public AvengerInformationModule(int characterId) {
    mCharacterId = characterId;
}

@Provides @Activity CharacterDetailsUsecase provideGetCharacterInformationUsecase (
    CharacterRepository repository,
    @Named("ui_thread") Scheduler uiThread,
    @Named("executor_thread") Scheduler executorThread) {

    return new CharacterDetailsUsecase(mCharacterId, repository, uiThread, executorThread);
}

@Provides @Activity GetCollectionUsecase provideGetCharacterComicsUsecase (CharacterRepository repository,
    @Named("ui_thread") Scheduler uiThread,
    @Named("executor_thread") Scheduler executorThread) {

    return new GetCollectionUsecase(mCharacterId, repository, uiThread, executorThread);
}
}

我不明白当演示者不在任何其他模块中时如何将演示者注入活动中。有没有关于构造函数注射的东西,我没有得到?

1 个答案:

答案 0 :(得分:0)

因此...

CDActivity <- CDPresenter <- CDUsecase <- [...]

我认为您可以遵循UseCase构造,因为它是由模块创建的。如果我们因此忽略它的依赖关系,你可以看到上面的简单图形。

活动需要它的演示者,这取决于用例。

  

有没有关于构造函数注射的东西,我没有得到?

完全。演示者使用构造函数注入:

@Inject
public CharacterDetailPresenter(CharacterDetailsUsecase getCharacterInformationUsecase) {
    mGetCharacterInformationUsecase = getCharacterInformationUsecase;
}

请参阅@Inject带注释的构造函数?你注释构造函数,匕首就能看到它。如果可以从组件提供对象的每个依赖项(构造函数参数),则组件也可以提供对象 - 在这种情况下为演示者。

活动组件包含UseCase(由模块提供),它知道Presenter(带注释的构造函数),因此它可以提供演示者。活动要求主持人......匕首只需交出来。

Dagger只是生成代码。试着看看生成的源文件!也许看看匕首在引擎盖下做什么!

请确保你真正理解构造函数注入,因为在我看来,它是依赖注入最强大的东西,并且会为你节省代码行的内容。

我还写了一篇文章,试图概述dagger basics

这段代码实际上有些容易出错,因为演示者是未对比的,并且会在每次注入时重新创建。你应该 - 尽可能 - 范围你的对象。如果使用构造函数注入,则会对类本身进行注释:

@Activity public class CharacterDetailPresenter implements Presenter { /* */ }