Dagger 2动态依赖项(Android) 问题
我正在使用MVVM架构和Dagger 2制作一个android应用程序。我的ViewModel有一个依赖项-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 //…其他依赖项 ) 界面视图模型委托{ //
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
。但显然我的片段并不同时需要两个,它只需要使用其中一个