使用Dagger 2的DI,替换构建组件

时间:2016-07-30 07:57:42

标签: android dependency-injection dagger-2

我对Dagger2比较陌生,但我开始喜欢在我的项目中使用它的优势。我目前正在尝试了解自定义范围。

我有这个基本的应用设置:ApplicationComponentActivityComponentUserComponent。这就是我打算让他们在我的应用程序中工作的方式

                  [-----------User scope-------------]
[ Activity scope ][ Activity scope ][ Activity scope ][ Activity scope ]
[-----------------------Aplication Scope (Singleton)-------------------]

在中间的两个活动中,用户已登录。

我的依赖关系图如下所示:AplicationComponent< - ActivityComponent< - UserComponent

UserComponent取决于ActivityComponent工作,ActivityComponent取决于AplicationComponent

UserComponent只是一个“Specialized”ActivityComponent,它还提供当前登录的用户。 不需要用户的活动将仅使用ActivityComponent注入,需要注入用户的人将需要使用UserComponent。希望它有意义。

当用户第一次登录时,我会在当前活动中创建UserComponent

ActivtyComponent activityComponent = DaggerActivityComponent.builder()
        .activityModule(new ActivityModule(this)) //** here, 'this' is the current Activity
        .applicationComponent(MyApplication.getApp(getActivity()).getAppComponent())
        .build();

UserComponent userComponent = DaggerUserComponent.builder()
        .activityComponent(activityComponent)
        .build();

userComponent.inject(this);

//Store user component to be retrieved by other activities
MyApplication.getApp(getActivity()).storeUserComponent(userComponent);

这很好用。现在,假设我开始 new 活动并尝试注入其依赖项。这个时间要容易得多,因为这个原因我已经存储了一个UserComponent!我可以使用那个,对吧?:

MyApplication.getApp(getActivity()).getUserComponent().inject(this);

错了!......它会崩溃!因为该组件仍然存储在其活动模块中的先前活动(**见上面的代码)

而且我不想创建另一个UserComponent,这会使范围变得无用......所有提供的方法都会被再次调用,我是对的吗?

我需要那个特定的组件,而不是新组件。但我必须以某种方式将其ActivityComponent换成一个新的,新的将在其activityModule中传递此活动...这是我的问题:

有可能吗?我是以正确的方式看待这个吗? 我可以更改已构建组件中的子组件吗?

提前致谢

1 个答案:

答案 0 :(得分:1)

通常大多数教程显示的方式是您拥有AppComponent <- UserComponent <- ActivityComponent

之类的依赖关系

组件创建一次范围对象,如果有什么变化,您应该创建一个新组件。匕首2中没有热交换模块或物体,如果你试着这样想,你会明白为什么:
如果你提供依赖关系A,那么在任何地方使用A,然后用NEW-A替换A并从那时开始使用NEW-A ......这是一个你可能想要避免的真正不一致的状态。

组件应该处于各自的生命周期中。如果您的组件保留对活动的引用,它应该与此活动一起使用,否则将导致内存泄漏(或类似您的错误)。

如果您的用户组件依赖于应用程序,那么您可以将该组件存储在应用程序中而不会产生任何问题。然后,您的活动只需使用应用程序或用户组件创建自己的作用域组件。