我有很多代码使用ViewModelLocator来设置视图上的数据文本。
我目前正在使用一个简单的服务定位器(Simple / CuttingEdge.ServiceLocation),以便可以从窗口或UserControl.Resources中的XAML中实例化具有无参数构造函数的ViewModelLocator,然后使用它来设置DataContext。
我正在更改为使用Ninject,并认为我可以继续使用ViewModelLocator以同样的方式。但是,我现在发现Ninject并不直接支持服务位置(服务地点似乎是一个不受欢迎的概念。)。
我想继续从XAML (使用ViewModelLocator派生类)中指定一个视图视图模型,但是我找不到用Ninject进行此操作的整洁性。
我找不到任何办法。如果没有支持IoC (或类似的)的IServiceLocator容器,其他开发人员是如何做到这一点的?
备注:
发布于 2013-08-07 17:12:41
事实上,服务定位器作为一个概念正在失宠。但是,有时候,正如在您的例子中所描述的,当您使用ViewFirst方法时,您需要在XAML标记中实例化ViewModel。我强烈建议不要这样做,转而采用ViewModelFirst方法,但我明白,您不可能一次改变整个世界。原始的杯标框架有标记扩展,允许解析XAML代码中的实例。卡利本有某种类型的容器抽象,可以从IoC静态类访问。您可以在这里找到标记代码:
http://caliburn.codeplex.com/SourceControl/latest#src/Caliburn.PresentationFramework/ResolveExtension.wpf.cs
我建议您不要像在Microsoft Common Service Locator中那样使用服务定位器抽象,而是直接调用静态全局IResolutionRoot并使用自定义实现的标记扩展来解析实例。这应该不会太难实现。一旦您完成了这个任务,我将开始将您的解决方案重新设计成一个VMFirst方法,这样您就可以消除通过Locator解决依赖关系的需要,并倾向于一种更反转的控制方法。
https://stackoverflow.com/questions/18094940
复制相似问题