2

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

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

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

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

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

4

1 回答 1

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视图控制器。

于 2017-03-28T10:15:37.993 回答