我使用GregorianCalendar
注入依赖项,到目前为止它一直很好用。但是现在我有一个场景,其中Swinject
依赖于ViewController
。 ViewModel
符合ViewModel
协议,可以是两种类型之一(两种类型都符合相同的协议,但具有不同的行为)。
我试图找出如何注入正确的ViewModeling
(必须在运行时做出决定)?
我注意到我可以使用ViewModel
按Container
注册每个ViewModel
,然后使用name
来区分name
应该注入,这最初似乎是一个很好的解决方案 - 直到我发现我无法用名称实例化ViewModel
(或者我可能错过了它?)
我还考虑过在我的ViewController
类上公开一个属性,用于手动注入右DependencyInjector
- 虽然我觉得这种方法完全忽略了有自动依赖注入解决方案,并且还强迫我用一些业务逻辑代码弄脏依赖注入器。
任何帮助或想法都将受到赞赏。
答案 0 :(得分:2)
不将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
注入视图控制器。