带有Ninject的MVVM ViewModelLocator

时间:2013-08-07 04:53:48

标签: wpf mvvm ninject datacontext service-locator

我有很多代码使用ViewModelLocator在视图上设置datacontext。

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

我正在改变使用Ninject的过程,并认为我能够以相同的方式继续使用ViewModelLocator。但是,我现在发现Ninject不直接支持服务位置(and it appears that service location is a concept that has fallen out of favor)。

我想继续从XAML指定一个视图viewmodel(使用ViewModelLocator派生类),但是我找不到用Ninject做这件事的整洁。

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

注意:

1 个答案:

答案 0 :(得分:2)

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

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

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