Dagger 2动态依赖项(Android) 问题

Dagger 2动态依赖项(Android) 问题,android,dependency-injection,dagger-2,dagger,android-mvvm,Android,Dependency Injection,Dagger 2,Dagger,Android Mvvm,我正在使用MVVM架构和Dagger 2制作一个android应用程序。我的ViewModel有一个依赖项-delegate,它被键入到ViewModelDelegate界面 class MyFragment():DaggerFragment(){ @注入lateinit var viewModel:viewModel // ... } class ViewModel@Inject构造函数( 私有val委托:ViewModelDelegate //…其他依赖项 ) 界面视图模型委托{ //

我正在使用MVVM架构和Dagger 2制作一个android应用程序。我的ViewModel有一个依赖项-
delegate
,它被键入到
ViewModelDelegate
界面

class MyFragment():DaggerFragment(){
@注入lateinit var viewModel:viewModel
// ...
}
class ViewModel@Inject构造函数(
私有val委托:ViewModelDelegate
//…其他依赖项
)
界面视图模型委托{
// ...
}
我有不同的ViewModelDelegate实现。当我创建
MyFragment
时,我想选择哪一个作为视图模型中的依赖项注意:
viewmodeldegate
的实现也是DI图的一部分,可能有自己的依赖关系。

class OneDelegateImpl@Inject构造函数(
//…依赖关系
):ViewModelDelegate
类AnotherDelegateImpl@Inject构造函数(
//…依赖关系
):ViewModelDelegate
问题: 如何告诉我的片段在其视图模型中使用哪个委托

我所尝试和考虑的 我在fragment dagger模块中为
ViewModelDelegate
创建了一个提供程序函数。此函数将返回
OneDelegateImpl
另一个delegateimpl
,但如何告诉它在运行时需要哪一个?嗯,我可以在片段中传递一个参数,某种标志,指示要提供哪个实现

@ContributesAndroidInjector(模块=[MyFragmentModule::class])
fun myFragment():myFragment
@模块
抽象类MyFragmentModule{
@提供
有趣的viewModelDelegate(
片段:MyFragment,
oneDelegateImplProvider:提供程序,
另一个DelegateImplProvider:提供程序
):ViewModelDelegate{
val flag=fragment.arguments?.getString(“委托”、“一”)?:“一”
返回时间(标志){
“一”->oneDelegateImplProvider.get()
“另一个”->另一个DelegateImplProvider.get()
else->oneDelegateImplProvider.get()
}
}
fun myFragmentWithAnotherDelegate():MyFragment{
返回MyFragment().apply{
参数=Bundle().apply{
putString(“委托”、“其他”)
}
}
}
注意:我使用
Provider
type获取委托对象,而不是绑定最终可能不需要的对象本身。

这个解决方案可行,但我有一些问题

  • 这是一个非常容易出错的解决方案。跟踪所有指示符常量以及匹配的内容-不,谢谢
  • 这也是不可伸缩的。如果我有两个以上的委托实现,它将变得一团糟
  • 最后,为了构建
    MyFragmentModule
    ,我必须在这个模块中提供
    OneDelegateImpl
    AnotherDelegateImpl
    的每一个依赖项。这是有意义的,因为在这种方法中,我使
    MyFragment
    组件依赖于
    OneDelegateImpl
    AnotherDelegateImpl
    。但显然我的片段并不同时需要两个,它只需要使用其中一个
  • 还有更优雅的解决方案吗

    提前谢谢你