2011-05-14 77 views
4

我正在使用C#和Unity依賴注入在WPF中開發MVVM應用程序。我正在爲以下問題尋找最乾淨的解決方案。例如,我有一個類AudioChannelViewModel(讓我們簡稱爲A),我想註冊兩個類的實例,一個用於Channel.Left,一個用於Channel。對。這本身並不是一個問題,因爲我通過將它們命名爲RegisterType,然後在[Dependency(name)]屬性中引用它們來註冊這些實例。使用枚舉參數化對象

此外,A取決於其他一些類,讓我們稱之爲Dep1,Dep2和Dep3。爲了執行A的初始化,我必須擁有我的所有依賴關係和關於Channel的信息。

我嘗試使用以下策略:

  1. 地產注入DEP1,DEP2和DEP3的,並通過與InjectionConstructor參數設置RegisterType A的通道中構造。但是,我應該如何知道A什麼時候可以初始化? AFAIK我不能假設任何有關物業注入訂單。

  2. 建設者注入所有四個項目。這將是恕我直言的最乾淨的解決方案,因爲我可以在構造函數中執行初始化。但是我無法在Unity中使用它。爲Channel註冊A與InjectionConstructor參數會引發異常,並且註冊四個InjectionConstructor參數看起來很難。

  3. 建設者注入Dep1,Dep2和Dep3以及Channel的屬性注入。然後我可以在Channel setter中初始化我的課程。它適用於這種情況,但是如果A會被多個屬性參數化,該怎麼辦?然後我不知道A何時完全建立並準備好進行初始化。

應該如何執行初始化?或者,我可能讓事情變得過於複雜。

回答

4

你並沒有確切地說明在策略#2中觀察到的異常,但這是我將使用的方法(考慮到您的其他需求可以使其他初始化成功解決所有依賴關係) 。我懷疑問題是您沒有爲構造函數的所有參數提供'值'... InjectionConstructor假定您想要的構造函數是與提供給InjectionConstructor的值的類型相匹配的構造函數。

E.g.如果你想註冊一個構造這樣一類...

public class AudioChannelViewModel { 
    public AudioChannelViewModel(Channel channel, Dep1 dep1, Dep2 dep2, Dep3 dep3) { 
    ... 
    } 
} 

你應該這樣註冊它...

container.RegisterType<AudioChannelViewModel>("left", 
    new InjectionConstructor(Channel.Left, 
     typeof(Dep1), typeof(Dep2), typeof(Dep3))); 
container.RegisterType<AudioChannelViewModel>("right", 
    new InjectionConstructor(Channel.Right, 
     typeof(Dep1), typeof(Dep2), typeof(Dep3))); 

統一將使用所提供的值作爲第一個參數(一個Channel枚舉值),然後將解析Dep1,Dep2Dep3實例。如果您需要Dep1,Dep2Dep3的特定命名實例,您也可以使用ResolvedParameter<T>作爲InjectionConstructor的參數。

僅僅提供Channel.LeftChannel.Right是不夠的,因爲Unity會認爲它被要求使用一個構造函數,只有一個Channel參數。

或;如果你已經嘗試過,並且它不工作......也許Unity在這種情況下不支持枚舉(雙關意圖)。

MSDN page可能會在這個問題上發光一些。

+0

哦,我只是不知道我可以將依賴類型傳遞給InjectionConstructor的構造函數。謝謝!你的方法完美運作。 – madbadger 2011-05-15 10:05:48