我认为我理解了依赖注入如何与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);
}
}
我不明白当演示者不在任何其他模块中时如何将演示者注入活动中。有没有关于构造函数注射的东西,我没有得到?
答案 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 { /* */ }