1

我有很多代码使用 ViewModelLocator 在视图上设置数据上下文。

我目前正在使用一个简单的服务定位器(Simple Injector / CuttingEdge.ServiceLocation),以便可以从 Window 或 UserControl.Resources 中的 XAML 实例化具有无参数构造函数的 ViewModelLocator,然后用于设置 DataContext。

我正在改用 Ninject,并认为我可以继续以同样的方式使用 ViewModelLocator。但是,我现在发现 Ninject 并不直接支持服务定位(而且服务定位似乎是一个已经失宠的概念)。

我想继续从 XAML 指定视图视图模型(使用 ViewModelLocator 派生类),但我找不到使用 Ninject 执行此操作的整洁之处。

我找不到任何方法来做到这一点。如果没有支持 IServiceLocator(或类似)的 IoC 容器,其他开发人员如何做到这一点?

笔记:

4

1 回答 1

2

事实上,服务定位器作为一个概念正在失宠。但有时,正如您在执行 ViewFirst 方法时所描述的那样,您需要在 XAML 标记中实例化 ViewModel。我强烈建议不要这样做并退回到 ViewModelFirst 方法,但我明白你不能一次改变整个世界。最初的 caliburn 框架具有标记扩展,允许从 XAML 代码解析实例。Caliburn 有某种容器抽象,可以从IoC静态类访问。您可以在此处找到标记代码:

http://caliburn.codeplex.com/SourceControl/latest#src/Caliburn.PresentationFramework/ResolveExtension.wpf.cs

我建议您不要使用服务定位器抽象,Microsoft Common Service Locator而是直接调用您的静态全局IResolutionRoot并使用自定义实现的标记扩展从那里解析实例。这不应该太难实现。一旦你有了它,我就会开始将你的解决方案重新设计为 VMFirst 方法,这样你就可以消除通过 Locator 解决依赖关系的需要,并倾向于一种更反转的控制方法。

于 2013-08-07T17:12:41.713 回答