使用Swinject将ViewModel条件注入ViewController

时间:2017-03-22 12:10:34

标签: ios swift mvvm swinject

我使用GregorianCalendar注入依赖项,到目前为止它一直很好用。但是现在我有一个场景,其中Swinject依赖于ViewControllerViewModel符合ViewModel协议,可以是两种类型之一(两种类型都符合相同的协议,但具有不同的行为)。

我试图找出如何注入正确的ViewModeling (必须在运行时做出决定)?

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

我还考虑过在我的ViewController类上公开一个属性,用于手动注入右DependencyInjector - 虽然我觉得这种方法完全忽略了有自动依赖注入解决方案,并且还强迫我用一些业务逻辑代码弄脏依赖注入器。

任何帮助或想法都将受到赞赏。

1 个答案:

答案 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注入视图控制器。