碎片和交换模块中的 Dagger 2 注入

Dagger 2 injection in Fragments and swapping Modules

我已经开始使用 Dagger 2,但我不确定在以下复杂情况下我 运行 是否做对了:

假设我有一个用 House 初始化的 HouseModule 和一个用 Window.

初始化的 WindowModule

现在我有一个 HouseFragment 应该是关于房子的一般信息。 因此我创建了一个 HouseComponent 包括 HouseModule.

到目前为止一切顺利。 现在 HouseFragment(ViewPager) 中有多个嵌套的 HouseDetailsFragment,它们显示有关 HouseWindow 的信息。 我创建了一个 HouseDetailsComponent 包括 HouseModuleWindowModule.

我的依赖图如下所示:

// provides application wide dependencies (Application context, SharedPref, Repository,...)
@Component(modules = {ApplicationModule.class}) 
public interface ApplicationComponent { 

}

// provides general activity dependencies (Navigator,... )
@Component(dependencies = ApplicationComponent, modules = {ActivityComponent.class}) 
public interface ActivityComponent{
    void inject(MainActivity mainActivity); 
}

// provides house fragment specific dependencies (HousePresenter,...)
@Component(dependencies = ApplicationComponent, modules = {ActivityComponent.class, HouseComponent.class}) 
public interface HouseComponent extends ActivityComponent {
    void inject(HouseFragment fragment);  
}

// provides house details fragment specific dependencies (HouseDetailsPresenter,...)
@Component(dependencies = ApplicationComponent, modules = {ActivityComponent.class, HouseComponent.class, WindowComponent.class}) 
public interface HouseDetailsComponent extends ActivityComponent {
     void inject(HouseDetailsFragment detailsFragment);  
}

组件创建以这种方式变得越来越复杂,我想知道如何将依赖项注入 HouseFragment,尤其是 HouseDetailsFragment 最好。 例如要构建 HouseDetailsComponent 我必须执行以下操作:

// casting omitted
DaggerHouseDetailsComponent.builder()
.applicationComponent(getActivity().getApplication().getApplicationComponent())
.activityModule(getActivity().getActivityModule())
.houseModule(getParentFragment().getHouseModule())
.windowModule(new WindowModule(window)).build().inject(this);

我不喜欢父片段和活动所需的知识(和演员表)。 有没有更简单的方法来实现我想做的事情?关于依赖图还有其他建议吗?

另外,如何在 HouseFragment 中显示不同的 House?我想创建一个新的 HouseModule 然后换掉另一个……但我该怎么做?没有 afaik 访问器。

我一直在使用子模块来简化层次结构。

还有 Dagger 2.11+ supports Android 并使注射更容易。