2010-08-02 119 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