gpt4 book ai didi

ios - 使用 Swinject 有条件地将 ViewModel 注入(inject) ViewController

转载 作者:可可西里 更新时间:2023-11-01 01:23:03 25 4
gpt4 key购买 nike

我正在使用 Swinject 来注入(inject)依赖项,到目前为止效果很好。但现在我有一个场景,其中我有一个 ViewController,它依赖于它的 ViewModelViewModel 符合 ViewModeling 协议(protocol)并且可以是两种类型之一(两者都符合相同的协议(protocol),但具有截然不同的行为)。

我想弄清楚如何注入(inject)正确的ViewModel(必须在运行时做出决定)?

我注意到我可以使用 Container 通过 name 注册每个 ViewModel 然后使用 name 来区分应该注入(inject)哪个 ViewModel,起初这似乎是一个很好的解决方案 - 直到我发现我无法实例化 ViewController 名称(或也许我错过了?)

我还考虑过在我的 DependencyInjector 类上公开一个属性,该属性将用于手动注入(inject)正确的 ViewModel - 尽管我觉得这种方法完全错过了拥有自动依赖注入(inject)解决方案的要点,并且还迫使我用一些业务逻辑代码弄脏了依赖注入(inject)器。

任何帮助或想法将不胜感激。

最佳答案

不将 DI 与应用程序逻辑混合的一种方法是某种“代理” View 模型,它将实现用于区分两个变体的逻辑。您可以使用不同的接口(interface)实现它,例如

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 注入(inject) View Controller 。

关于ios - 使用 Swinject 有条件地将 ViewModel 注入(inject) ViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42951265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com