我希望有人能为我的用例提供一些最佳实践。
我在wpf用户控件中使用mvvm light和simpleIoC容器。我注册了模型并查看了模型,数据服务和设计时服务(根据mvvm light示例代码,这很多)
我所看到的SimpleIoC容器用法示例似乎总是将容器视为GalaSoft命名空间的静态/全局容器。
但是,如果我要在同一应用程序中创建WPF控件的两个实例,我当然希望每个用户控件都具有自己的一组VM和Model实例。因此基本上是它自己的一组SimpleIoC注册实例。当默认的IoC容器似乎是静态对象时,如何最好地做到这一点?
答案 0 :(得分:1)
获取实例时,您可以选择提供密钥。尽管默认情况下每种类型都有一个单例,但这会为每个键生成另一个该类型的缓存版本。意味着您可以根据需要使用GUID或其他东西作为密钥。
但是有潜在的问题。如果您获得100个不同版本的实例,则它们将全部存储在您的应用程序的生命周期中。
如果这只是几个实例,您可能会没事的。
还有更多,您最好使用更复杂的di容器。 SimpleIoC仅用于简单的用例。
但是,您可以在获取实例时使用工厂方法。这不符合我的口味,但是如果您真的想使用simpleioc,则需要考虑一下。
您可以在此处从Laurent Bugnion了解更多信息。
答案 1 :(得分:0)
这就是工厂模式旨在解决的问题,您创建一个创建控件视图模型的类,然后将其注入。
关注点分离也更好。
答案 2 :(得分:0)
当默认的IoC容器似乎是静态对象时,如何最好地做到这一点?
不使用默认容器,而是创建自己的SimpleIoc
类实例:
用户控件A:
SimpleIoc containerA = new SimpleIoc();
containerA.Register<ViewModel>();
...
ViewModel vm = containerA.GetInstance<ViewModel46>();
用户控件B:
SimpleIoc containerB = new SimpleIoc();
...