MVVM Light ViewModelLocator:如何注册Singleton ViewModel?

时间:2016-03-08 03:31:50

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

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

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

调试时,错误类似于“无法注册:找不到公共构造函数&#39;。

所以有2个问题:

  1. 使用Singleton ViewModel是不错的主意?
  2. 如何注册Singleton ViewModel,因为我没有找到任何重载来传递特定接口的实例?

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

我有一个案例,我想自己注册一个单例,因为我需要给对象构造函数一个参数。

然后我通过执行以下操作注册了单例实例:

SimpleIoc.Default.Register<IInterface>(() => new ImplementationClass(param));

该对象将仅被构造一次,这是第一次调用该行:

ServiceLocator.Current.GetInstance<IInterface>();