c# - MVVM 光 ViewModelLocator : How to register Singleton ViewModel?

标签 c# mvvm dependency-injection inversion-of-control service-locator

我熟悉 MVVM Light 工具包的 ViewModelBase、Message,但不熟悉 ViewModelLocator。在我的应用程序中有 Singleton ViewModel,例如 PrinterViewModel。注册就像

SimpleIoc.Default.Register<IPrinter,PrinterViewModel>();

调试时,错误类似于“无法注册:未找到公共(public)构造函数”。

所以 2 个问题:

  1. 使用 Singleton ViewModel 是个坏主意吗?
  2. 如何注册 Singleton ViewModel,因为我没有找到任何重载来为特定接口(interface)传递实例?

最佳答案

1) 根据一般经验,是的。设置作用域是注入(inject)框架的工作。您可能有一个数据库存储库类(比方说)需要 WPF 构建中的每个表单范围(以便用户可以取消编辑)、Web 构建中的每个请求范围和命令行工具中的单例范围。类本身及其任何使用者都不应知道该对象的作用域是什么。

2) 一个简单(但不是很好)的解决方案是将单例实例添加到您的 ViewModelLocator 并始终返回它。另一种是在没有 key 的情况下只调用 GetInstance() 并依赖于延迟创建。不过,我不是 SimpleIoC 的 super 粉丝,它对我来说有点简单了。尝试看看功能更全面的框架,例如 Ninject,您会发现它们的使用更加灵活和流畅,例如:

Bind<IPrinter>().To<PrinterViewModel>().InSingletonScope();

关于c# - MVVM 光 ViewModelLocator : How to register Singleton ViewModel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35858413/

相关文章:

c# - 从 FilterQueryOption 获取 Linq 表达式抛出 CLR 异常

wpf - 根据子属性设置表单 MinWidth 和 MinHeight

c# - 具有复杂模型的 MVVM

c# - 从服务定位器到依赖注入(inject)

javascript - 接受参数的依赖注入(inject)构造函数

c# - PHP 作为嵌入式脚本语言

c# - 使用 EF LazyLoading 初始化属性?

c# - 使用 Input.GetKey 的按键多次返回 true

c# - 根据 MainViewModel 中的状态启用/禁用不同 View 上的控件的最佳方法

c# - 我们什么时候需要IOptions?