首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dagger 2:在一个对象中注入2个不同的作用域

Dagger 2:在一个对象中注入2个不同的作用域
EN

Stack Overflow用户
提问于 2018-11-21 01:53:31
回答 1查看 389关注 0票数 1

在有人开始将这个问题标记为重复之前,我要说我已经检查了这个post,但它没有解决我的问题。

正如标题所说,我需要在其他对象中注入来自不同作用域的两个对象。假设我们有下一种情况:

我们有一个允许用户注册的屏幕,然后在同一个屏幕上,我们根据用户会话执行一些操作(例如:进行一些同步)。

对于我的项目,我计划使用子组件。到目前为止,我有基于这个post的下一个代码(简化的)

代码语言:javascript
复制
@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);
  }
}

现在,为了简单起见,假设我有一个组件(活动、视图模型、presenter等),它将具有这两个依赖项:

代码语言:javascript
复制
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框架和内部

代码语言:javascript
复制
public class UserSessionSync {
  @Inject
  UserSessionSyncHelper userSessionSyncHelper;

  public UserSessionSync(){
    MyApplication.getUserSessionComponent().inject(this)
  }
}

在我看来,这不是解决这个问题的好方法。

EN

回答 1

Stack Overflow用户

发布于 2018-11-21 04:50:41

我试过使用Dagger-Android,工作正常。此外,模块对于AppSignUp来说也不是真正需要的。带有@Singleton的@Inject构造函数()可以做到这一点。在幕后,它使用子组件。

代码语言:javascript
复制
@Module
abstract class AppModule {

    @Module
    companion object {

        @JvmStatic
        @Provides
        @Singleton
        fun providesAppSignUp() = AppSignUp()

    }
}

@Singleton
@Component( modules = [AndroidSupportInjectionModule::class, ActivityBindingModule::class, AppModule::class] )
interface AppComponent : AndroidInjector<MainApplication>

@Module
interface ActivityBindingModule {

    @UserScope
    @ContributesAndroidInjector( modules = [MainActivityModule::class] )
    fun mainActivity() : MainActivity
}

@Module
abstract class MainActivityModule {

    @Module
    companion object {

        @JvmStatic
        @Provides
        @UserScope
        fun providesUserSession() = UserSession()
    }
}

class UserSession

class AppSignUp

@Scope
annotation class UserScope

class MainApplication : DaggerApplication() {

    @Inject
    lateinit var appSignUp : AppSignUp

    override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
        return DaggerAppComponent.builder().build()
    }

}

class MainActivity : DaggerAppCompatActivity() {

    @Inject
    lateinit var appSignUp: AppSignUp

    @Inject
    lateinit var appSignUp1: AppSignUp

    @Inject
    lateinit var userSession: UserSession

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53398783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档