2011-06-07 149 views
6

我目前正在學習MVVM模式,我正在使用的教程使用Unity for DI。我之前沒有真正使用過DI,只是想澄清一下我對這個特定代碼如何工作的看法。MVVM和依賴注入

在查看我:

private ViewModel vm; 

    [Dependency] 
    public ViewModel VM 
    { 
     set 
     { 
      vm = value; 
      this.DataContext = vm; 
     } 

    } 

在依賴屬性告知團結在這裏注入。該視圖模型構造函數採用其與統一登記爲這樣的IQuoteSource對象:

 IUnityContainer container = new UnityContainer(); 
     RandomQuoteSource randomQuoteSource = new RandomQuoteSource(); 
     container.RegisterInstance<IQuoteSource>(randomQuoteSource); 
     MainWindow window = container.Resolve<MainWindow>(); 
     window.Show(); 

究竟是如何做到這一點的工作,因爲我使用上述財產從未明確創建視圖模型的對象。這是否都是在Unity內處理的,如果是這樣的話,它是如何實現的?

謝謝。

回答

6

這與MVVM模式沒有多大關係本身,除了視圖對其ViewModel的依賴性通過依賴注入解決的事實。

這是如何工作的,它非常簡單。有3個簡單的概念爲DI:

首先是聲明依賴,一些對象指定它所依賴的東西,無論是通過構造函數或屬性(在你的情況爲例,使用DependencyAttribute )。

第二個概念是註冊,在那裏你註冊你的對象有依賴關係的實現(在你的情況,你註冊的IQuoteSource的實現)。請注意,您並不需要註冊 ViewModel,因爲它不是真正實現您所依賴的接口。

第三個是什麼膠合的東西放在一起,這是解決依賴,在那裏你問的容器,以解決某些類型的適合你,它會和着眼於反對宣佈(在你的情況有什麼相關性,您正在解決對ViewModel有依賴性的MainWindow),找到正確的已註冊的實施並解決它。該行爲級聯通過對象圖形的分辨率(其解決了IQuoteSource上ViewModel的依賴性)。

希望這會有所幫助:)

0

它屬於VM屬性的MainWindow?如果沒有,我假設解決MainWindow開始某種解決級聯,在某些時候包括創建在您的示例中具有VM屬性的對象。

Unity會檢查它必須在級聯中爲由[Dependency]修飾的屬性解析的每個對象,並創建依賴屬性類型的對象。當它創建像這樣的對象時,它會選擇具有最多參數的構造函數,它知道如何創建,這是您註冊IQuoteSource - > RandomQuoteSource的地方。

+0

嗨,是的VM是MainWindow的一個屬性。謝謝。 – 2011-06-07 10:49:17