【发布时间】:2018-11-20 17:53:30
【问题描述】:
在有人开始将此问题标记为重复之前,让我说我已经检查过这个post,但它并没有解决我的问题。
正如标题所说,我需要在另一个对象中注入来自不同范围的两个对象。 假设我们有下一种情况:
我们有一个让用户注册的屏幕,然后在同一个屏幕中,我们根据用户会话执行一些操作(例如:进行一些同步)。
对于我的项目,我计划使用子组件。到目前为止,我有基于此post 的下一个代码(简化):
@Singleton
@Component(modules = {AppModule.class})
public interface AppComponent {
static AppComponent init(MyApplication application) {
return DaggerAppComponent.builder()
.appModule(new AppModule(application))
.build();
}
UserSessionComponent plusUserSessionComponent(UserSessionModule userSessionModule);
void inject(MyApplication application);
}
@Module
public class AppModule {
private MyApplication myApplication;
public AppModule(@NonNull MyApplication myApplication) {
this.myApplication = myApplication;
}
@Provides
@Singleton
public AppSignUp provideAppSignUp() {
return new AppSignUp();
}
}
@UserSessionScope
@Subcomponent(modules = {UserSessionModule.class})
public interface UserSessionComponent {
static UserSessionComponent init(AppComponent appComponent,
UserSession userSession) {
return appComponent.plusUserSessionComponent(userSession);
}
void inject(MyApplication myApplication);
}
@Module
public class UserSessionModule {
private UserSession userSession;
public UserSessionModule(@NonNull UserSession userSession) {
this.userSession = userSession;
}
@Provides
@UserSessionScope
public UserSessionSyncHelper provideUserSession(UserSession userSession) {
return new UserSessionSyncHelper(userSession);
}
@Provides
@UserSessionScope
public UserSessionSync provideUserSession(UserSessionSyncHelper userSessionSyncHelper) {
return new UserSessionSync(userSessionSyncHelper);
}
}
现在,为了简单起见,假设我有一个组件(活动、视图模型、演示者或其他)将具有这两个依赖项:
public MyActivity extends AppCompatActivity {
@Inject
AppSignUp appSignUp;
@Inject
UserSessionSync userSessionSync;
public void onCreate(Bundle savedInstanceState) {
//to inject appSignUp
MyApplication.getAppComponent().inject(this);
}
public onUserCreated(UserSession userSession) {
//to inject userSessionSync
MyApplication.getUserSessionComponent().inject(this);
}
}
我的问题是 Dagger 在第一次注入时会抱怨,因为 AppModile 没有 userSessionSync。所以问题是,我该如何解决这个问题? Dagger 有适合这种场景的功能吗?
到目前为止,我只能想到下一个解决方案:
使 UserSessionSync 独立于 Dagger 框架和内部
public class UserSessionSync {
@Inject
UserSessionSyncHelper userSessionSyncHelper;
public UserSessionSync(){
MyApplication.getUserSessionComponent().inject(this)
}
}
在我看来,这不是处理这个问题的好方法。
【问题讨论】: