wpf - 带有Ninject的MVVM ViewModelLocator

标签 wpf mvvm ninject datacontext service-locator

我有很多代码使用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容器的情况下,其他开发人员如何做到这一点?

笔记:

  • 我使用的唯一MVVM库是Josh Smith的MvvmFoundation.Wpf。
  • 我看过博客文章Use Ninject to decouple discovery of your viewmodel's in mvvmlight's viewmodellocator,但是这种方法似乎不正确。
  • 最佳答案

    确实,服务定位器作为一个概念已不受欢迎。但是有时,如您所描述的情况,当您执行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/

    相关文章:

    c# - 在顶层使用 DependencyInjection,如何将服务传递到架构中?

    .net - 获取单例实例

    asp.net - 使用 Asp.Net MVC 和 Web Api 配置 Ninject

    c#-4.0 - 无法获取 Integration 类 ninject 的默认构造函数

    wpf - 将列表框项索引作为参数传递给 objectdataprovider

    wpf - 如何通过包含它的对象的接口(interface)公开私有(private)内部对象的依赖属性?

    asp.net - WPF 应用程序转换为 ASP

    wpf - 从上下文菜单的菜单项中检索所选项目。我正在使用 WPF、MVVM

    c# - 在 Xamarin.forms 中调用 Navigation.PushAsync 时如何等待过渡动画完成

    wpf - (WPF MVVM)如何将用户控件从 ViewModel 中的集合添加到 View