Ios 使用Swinject将ViewModel条件注入ViewController
我正在使用Ios 使用Swinject将ViewModel条件注入ViewController,ios,swift,mvvm,swinject,Ios,Swift,Mvvm,Swinject,我正在使用Swinject注入依赖项,到目前为止,它工作得很好。但现在我有了一个场景,其中我有一个ViewController,它依赖于它的ViewModelViewModel符合ViewModeling协议,可以是两种类型中的一种(两者都符合相同的协议,但具有完全不同的行为) 我试图弄清楚如何注入正确的视图模型(必须在运行时做出决定) 我注意到我可以使用容器通过名称注册每个视图模型,然后使用名称来区分应该注入哪个视图模型,这起初似乎是一个很好的解决方案-直到我发现我无法用名称实例化视图控制器(
Swinject
注入依赖项,到目前为止,它工作得很好。但现在我有了一个场景,其中我有一个ViewController
,它依赖于它的ViewModel
ViewModel
符合ViewModeling
协议,可以是两种类型中的一种(两者都符合相同的协议,但具有完全不同的行为)
我试图弄清楚如何注入正确的视图模型(必须在运行时做出决定)
我注意到我可以使用容器
通过名称
注册每个视图模型
,然后使用名称
来区分应该注入哪个视图模型
,这起初似乎是一个很好的解决方案-直到我发现我无法用名称实例化视图控制器
(或许我错过了?)
我还考虑过在我的DependencyInjector
类上公开一个属性,该属性将用于手动注入正确的ViewModel
——尽管我觉得这种方法完全没有实现自动依赖项注入解决方案的意义,也迫使我用一些业务漏洞来玷污依赖项注入器gic代码
任何帮助或想法都将不胜感激。避免将DI与应用程序逻辑混合的一种方法是某种“代理”视图模型,它将实现区分两个变体的逻辑。您可以使用不同的接口来实现它,例如
protocol ViewModelProxy {
var viewModel: ViewModel { get }
}
或者更透明地说:
protocol ViewModel {
func foo()
}
class ViewModelProxy: ViewModel {
private let viewModel1: ViewModel
private let viewModel2: ViewModel
private var viewModel: ViewModel {
if shouldUseViewModel1 {
return viewModel1
} else {
return viewModel2
}
}
func foo() {
viewModel.foo()
}
}
然后,您可以始终将
ViewModelProxy
插入视图控制器。是否将SwinjectStoryboard用于视图控制器?如果是,您可以在storyboard中使用swinjectRegistrationName
属性:我正在使用SwinjectStoryboard
,但您的建议意味着我必须保留两个重复的ViewController
s,每个都有一个不同的名称-这对我来说似乎是个问题(在ViewController
中的每次更改都意味着我必须记住更新两个副本)