2010-08-02 78 views
1

所以我正在尋找一些解釋如何從我的應用程序中刪除服務定位器。WPF DI服務定位器

我有一個ViewManagerService負責瞭解哪個視圖處於活動狀態,哪些視圖已打開並創建新視圖。

目前我的ViewModels通過構造函數注入獲取注入到它們中的IViewManagerService。這些的ViewModels揭露個ICommand是調用然後可以撥打電話到

viewManager.Transition("MyCoolView", somePrimaryKey); 

時ViewManagerService然後使用一個服務定位器來查找和實例化的關鍵「MyCoolView」的新觀點。使用密鑰字符串的原因是,我可以將View與ViewModels解耦。我想保持ViewManagerService的通用性,因此我可以將其用於其他應用程序,所以我不希望它依賴於特定的IAbstractFactory接口。

任何提示/建議?

回答

1

您可以完全使用WPF的數據模板引擎擺脫魔法的字符串。最好的方法是使用MVVM pattern。它與DI正交,但是一個偉大的推動者。

一旦你完成了這個轉換,你就可以擁有一個純粹的DI架構,而不必依靠Service Locator anti-pattern

+0

目前我的服務定位器需要在「魔術字符串」查找並實例化一個視圖。然後爲該視圖實例化一個特定的ViewModel,並將其設置爲DataContext。 (使用windsor)。然後它調用視圖模型上的Load(primaryKey)函數。如果我要使用數據模板引擎,我基本上有一個ContentPresenter,它已將DataContext設置爲我正在查看的特定ViewModel?然後,我會通過提供它的所有構造函數參數(IViewManagerService等)來創建我想要轉換到的ViewModel,或者我會以不同的方式使用atchitect嗎? – HaxElit 2010-08-03 14:36:15

+0

是的,你可以直接新建ViewModel,或者爲了更好的解耦,可以使用Abstract Factory。我傾向於選擇後者。 – 2010-08-03 16:54:19

+0

我會給它一個鏡頭!縱觀TypedFactoryFacility,看起來非常酷。將成爲重大改寫,但我認爲這是最好的。非常感謝,我肯定會抓住你的書,當它出來:) – HaxElit 2010-08-04 14:56:56