2

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

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

调试时,错误是一样的东西“不能登记:未找到公共构造”。

所以2个问题:

  1. 是不是坏主意,有辛格尔顿视图模型?
  2. 如何注册Singleton ViewModel,因为我没有发现任何重载为特定接口传递实例?

回答

4

1)作为一般的经验法则,是的。注射框架的任务是确定范围。您可能需要一个数据库存储库类(比如说),它需要WPF构建中的每个表单范围(所以用户可以取消编辑),Web构建中的每个请求范围和命令行工具中的单例范围范围。无论是班级本身还是任何消费者都不应该知道该物体已经提供了哪些范围。

2)一个简单的(也不是很好)解决方案就是将单例实例添加到ViewModelLocator中,并始终返回该实例。另一个是只需调用GetInstance()而不需要密钥并依赖于懒惰创建。虽然我并不是SimpleIoC的粉丝,但它也有点简单我喜欢。尝试采取一看像Ninject功能更全面的框架,你会发现他们很多在用法如更加灵活和流畅:

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

我有,我希望通过自己注册一个单身的情况下, ,因为我需要给对象构造函数一个参数。

我那么做注册的单一实例:

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

对象将构建只有一次,第一次这条线被称为:

ServiceLocator.Current.GetInstance<IInterface>(); 
相关问题