2017-03-22 28 views
2

我使用Swinject來注入依賴關係,並且迄今爲止它的工作效果很好。但是現在我已經有了一個場景,其中我有一個ViewController,它依賴於ViewModelViewModel符合ViewModeling協議,可以是兩種類型之一(都符合相同的協議,但具有深刻的不同行爲)。使用Swinject有條件地將ViewModel注入到ViewController中

我想弄清楚如何注入正確的ViewModel(必須在運行時作出的決定)?

我發現我可以使用Container通過name登記每個ViewModel的,然後使用name區分哪個ViewModel應注射,起初似乎是一個很好的解決方案 - 直到我發現我可以」牛逼實例化ViewController的名稱(或者也許我已經錯過了嗎?)

我也想過我DependencyInjector類暴露一個屬性,它會使用手動注入右01​​- 雖然它讓人感覺給我這種方法完全錯過了擁有自動依賴注入解決方案的重要性,並且迫使我用一些業務污染依賴注入器ogic代碼。

任何幫助或想法將不勝感激。

+0

您是否在視圖控制器中使用SwinjectStoryboard?如果是這樣,你可以在故事板中使用'swinjectRegistrationName'屬性:https://github.com/Swinject/SwinjectStoryboard#registration-with-name –

+0

我正在使用'SwinjectStoryboard',但你的建議意味着我必須保持兩個重複'ViewController's和每個人都會有一個不同的名字 - 這對我來說似乎是一個問題(ViewController中的每一個變化都意味着我必須記得更新這兩個副本) – goldengil

回答

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到視圖控制器。

相關問題