2016-07-24 57 views
1

我认为我理解依赖注入如何与Dagger 2一起工作,直到我在此处查看此项目:https://github.com/saulmm/AvengersDagger 2本示例中的构造函数注入

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

所以......

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

我想你能够按照UseCase建设,因为它是由一个模块创建。如果我们因此忽略它的依赖关系,可以看到上面简单的—图。

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

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

没错。演示者使用构造函数注入:

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

请参阅@Inject带注释的构造函数?你注释构造函数和匕首将能够看到它。如果可以从组件提供对象的每个依赖关系(构造器参数),则组件在此情况下也可以提供对象—。

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

匕首是生成的代码。试着看看生成的源文件!也许看看在兜帽下做了什么匕首!

请确保您真的了解构造函数注入,因为在我的愚见中它是关于依赖注入的最强大的事情,并且会为您节省代码行数。

我还写了一篇文章,试图给出关于dagger basics的概述。


此代码实际上有点容易出错,因为演示者无法显示,并且会针对每次注入重新创建。你应该尽可能地— —范围你的对象。如果你使用构造函数注入,你会注解类本身:

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

最初这就是我认为匕首创建的主持人,但感谢清楚拼写出来。我肯定会在将来看看生成的代码。 – hakuteru

+0

您的博客未显示如何执行构造函数注入的示例。我尝试过构造函数注入,但没有工作。请看看https://stackoverflow.com/q/45192878/5214893 –

+1

@eCDroid我会看看工作。我真的建议你在尝试在你的项目中使用Dagger之前先尝试一下。打开一个文件,声明一堆包本地组件,模块,类(有和没有依赖关系),并继续编译。你会很快找出你可以和不可以用匕首这样做。确保你知道什么时候Dagger调用构造函数注入的构造函数,以及何时必须向组件注册一个'inject(MyClass)'方法来进行字段注入。 –