2013-02-16 110 views
0

試圖解決我的存儲服務對象(大多爲單身接口)的容器,解決棱鏡服務在MVVM

有一個域模塊它是的ViewModels將使用服務服務模塊。

在哪裏以及如何你推薦這個,域模塊的ViewModels域模塊內內解決?

如果我能做到這一點的ViewModel的構造函數中,是下面的代碼不夠,服務被註冊後,如果我不想做什麼:

public DetailsViewModel(IWService wSvc,) 
    { 
     wService = wSvc; 
    } 

什麼是得到最好的辦法服務對象(存儲在容器中)在「查看模型」?

我在這裏提供的僅僅是一個示例。 感謝您的任何幫助

+0

只要您的視圖模型(DetailsViewModel)正在被統一容器解析,您上面的代碼應該爲視圖模型中的服務提供服務。你得到的是我看到Prism應用程序創建的標準方式。如果您的視圖模型不是由容器創建的,則需要將這些服務自己傳遞到視圖模型的構造函數中。我剛剛使用Prism編寫了一個應用程序,而且我基本上放棄了MVVM而轉而採用更多MVP類似的方法,因爲我發現VM(View Model)的整個概念在沒有演示者或控制器類的情況下非常混亂。 – Jay 2013-02-16 20:22:07

+0

@Jay感謝您的信息,對不起,當時我不在PC上,我仍在處理它,並試圖理解和利用一些較黑的部分,我喜歡它,並且我的代碼缺少一些片段,我正在嘗試修復它們。 :) – LastBye 2013-02-17 08:01:57

回答

2

我會建議您的ViewModels獲得他們使用的服務,通過構造函數的依賴注入。無論您決定什麼方法,您都應該記住,其中一個主要概念是測試ViewModel的能力。通常,這將涉及能夠爲您的ViewModel提供模擬實現的服務,以獨立於這些服務來測試其行爲。如果您使用構造函數注入,您可以簡單地創建您的模擬服務,然後將它們傳遞到ViewModel的構造函數中,以便測試是否要編寫單元測試。即使您目前不打算編寫單元測試,我認爲這是養成遵循某個設計方案習慣的合理原因。

public class SomeViewModel 
{ 
    private IEventAggregator events; 
    private ISomeService someService; 

    public SomeViewModel(IEventAggregator events, ISomeService someService) 
    { 
     this.events = events; 
     this.someService = someService; 
    } 
} 
+0

我提出了同樣的觀點,但要問一個簡單的問題:我試圖通過構造函數獲取IUnityContainer,之後調用後來定義的FetchServices方法,而後者定義了我的服務那裏,可以嗎?或者是否推薦在這種情況下使Container成爲單例? – LastBye 2013-02-21 12:35:30

+1

@LastBye不,你剛剛描述的不是一個好主意。你基本上正在創建一個單例或服務定位樣式模式,這首先會有點否定依賴注入的目的。你可能想查找「Composition Root」,雖然我完全不同意它,但它解釋了爲什麼你不想做你剛剛提到的東西 – Alan 2013-02-21 15:18:49

+1

@LastBye簡而言之,試着限制你的容器使用情況到每個模塊的入門級別,點。我會將IUnityContainer注入到您的IModule的(實現)構造函數中。然後,在Initialize方法中註冊您的類型並解析其組件,至少對於Unity。通常,其他類型的解析或注入其他類型的應該能夠將它們的依賴注入到構造函數中。 – Alan 2013-02-21 15:30:09