Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用Swinject将ViewModel条件注入ViewController_Ios_Swift_Mvvm_Swinject - Fatal编程技术网

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
中的每次更改都意味着我必须记住更新两个副本)