单子组件作弊
而不是您的应用程序中的正常实现:
public class YourApplication extends Application implements HasActivityInjector {
@Inject DispatchingAndroidInjector dispatchingActivityInjector;
@Override
public AndroidInjector activityInjector() {
return dispatchingActivityInjector; // Always get it from Multibindings.
}
}
只需将活动绑定模块移动到LoginComponent并委托给DispatchingAndroidInjector< Activity>而是从您的LoginComponent:
@Override
public AndroidInjector activityInjector() {
return getOrCreateLoginComponent().getActivityInjector();
}
这是持续维护的最少量,但它似乎相当倒退,因为您正在预先创建LoginComponent.但是,如果LoginComponent很便宜并且是此样式的唯一子组件,那么一切都运行良好:LoginComponent的注入器可以在其父项中看到多重绑定,因此LoginComponent的ActivityInjector将始终对父项中的绑定起作用.
由于非登录活动的绑定仍驻留在ApplicationComponent中,因此这些活动将无法使用父组件的绑定.否则,这无异于将您的LoginComponent合并到您的ApplicationComponent中,这可能不是一个选项,否则您就是这样做的.
委派AndroidInjector
如果您的LoginComponent创建起来很昂贵,那么作为替代方法,您可以在checkof instanceof后面移动getOrCreateLoginComponent()调用:
@Inject DispatchingAndroidInjector dispatchingActivityInjector;
@Override
public AndroidInjector activityInjector() {
return new AndroidInjector() {
@Override public void inject(Activity activity) {
if (Activity instanceof LoginActivity
|| Activity instanceof OtherLoginActivity) {
getOrCreateLoginComponent().getActivityInjector().inject(activity);
} else {
// You can chain other subcomponents here as well.
dispatchingActivityInjector.inject(activity);
}
}
};
}
这意味着您需要保留LoginComponent可以处理的活动的单独列表(可能是LoginComponent或LoginModule中的字段),但是如果您想要避免实例化LoginComponent,直到您确定要注入登录相关的活动,这是你如何检查它.上述方法也可以很好地扩展到多个子组件,因为您总是在一个DispatchingAndroidInjector< Activity>上调用注入.来自一个组件.
混合替代品
因为Map存在检查可能非常快,所以您还可以通过先将主注入器检查然后将其投入登录组件来避免该额外列表.当然,如果您拥有该样式的多个子组件,那将开始变得难看.
@Inject DispatchingAndroidInjector dispatchingActivityInjector;
@Override
public AndroidInjector activityInjector() {
return new AndroidInjector() {
@Override public void inject(Activity activity) {
if (!dispatchingActivityInjector.maybeInject(activity)) {
// It's not in the top level. Start checking subcomponents.
getOrCreateLoginComponent().getActivityInjector().inject(activity);
}
}
};
}