用户控件中的Mvvm light SimpleIoC

时间:2019-04-22 19:52:49

标签: wpf user-controls mvvm-light simpleioc

我希望有人能为我的用例提供一些最佳实践。

我在wpf用户控件中使用mvvm light和simpleIoC容器。我注册了模型并查看了模型,数据服务和设计时服务(根据mvvm light示例代码,这很多)

我所看到的SimpleIoC容器用法示例似乎总是将容器视为GalaSoft命名空间的静态/全局容器。

但是,如果我要在同一应用程序中创建WPF控件的两个实例,我当然希望每个用户控件都具有自己的一组VM和Model实例。因此基本上是它自己的一组SimpleIoC注册实例。当默认的IoC容器似乎是静态对象时,如何最好地做到这一点?

3 个答案:

答案 0 :(得分:1)

获取实例时,您可以选择提供密钥。尽管默认情况下每种类型都有一个单例,但这会为每个键生成另一个该类型的缓存版本。意味着您可以根据需要使用GUID或其他东西作为密钥。

但是有潜在的问题。如果您获得100个不同版本的实例,则它们将全部存储在您的应用程序的生命周期中。

如果这只是几个实例,您可能会没事的。

还有更多,您最好使用更复杂的di容器。 SimpleIoC仅用于简单的用例。

但是,您可以在获取实例时使用工厂方法。这不符合我的口味,但是如果您真的想使用simpleioc,则需要考虑一下。

您可以在此处从Laurent Bugnion了解更多信息。

https://msdn.microsoft.com/en-us/magazine/jj991965.aspx

答案 1 :(得分:0)

这就是工厂模式旨在解决的问题,您创建一个创建控件视图模型的类,然后将其注入。

关注点分离也更好。

答案 2 :(得分:0)

  

当默认的IoC容器似乎是静态对象时,如何最好地做到这一点?

不使用默认容器,而是创建自己的SimpleIoc类实例:

用户控件A:

SimpleIoc containerA = new SimpleIoc();
containerA.Register<ViewModel>();
...
ViewModel vm = containerA.GetInstance<ViewModel46>();

用户控件B:

SimpleIoc containerB = new SimpleIoc();
...