我有很多代码使用ViewModelLocator在 View 上设置数据上下文。
我当前正在使用一个简单的服务定位器(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(使用ViewModelLocator派生的类)指定 View viewmodel,但是我发现使用Ninject可以做到这一点很整洁。
我找不到任何办法。在没有支持IServiceLocator(或类似服务)的IoC容器的情况下,其他开发人员如何做到这一点?
笔记:
最佳答案
确实,服务定位器作为一个概念已不受欢迎。但是有时,如您所描述的情况,当您执行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来解决依赖关系,而倾向于使用更多的控制方法。
关于wpf - 带有Ninject的MVVM ViewModelLocator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18094940/