用户控件中的Mvvm light SimpleIoC

问题描述 投票:1回答:3

我希望有人能够对我的用例的最佳实践有所启发。

我在wpf usercontrol中使用mvvm light和simpleIoC容器。我注册我的模型并查看模型,数据服务和设计时服务(非常根据mvvm light示例代码)

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

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

wpf user-controls mvvm-light simpleioc
3个回答
0
投票

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

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

用户控制A:

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

用户控制B:

SimpleIoc containerB = new SimpleIoc();
...

1
投票

当您获得实例时,您可以选择提供密钥。虽然默认情况下每个类型都会获得一个单例,但每个键会生成该类型的另一个缓存版本。这意味着你可以使用guid或其他东西作为你需要的每个实例的密钥。

但是有一个潜在的问题。如果您获得了100个不同的版本,那么它们将在您的应用程序的生命周期中全部都在内存中。

如果这只是一些例子,你可能还可以。

任何更多,你可能最好使用更复杂的di容器。 SimpleIoC仅适用于简单的用例。

但是,当您获得实例时,可以使用工厂方法。这不符合我的口味,但如果你真的想使用simpleioc,那就需要考虑了。

你可以在这里阅读laurent bugnion的更多内容。

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


0
投票

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

更好地分离关注点。

© www.soinside.com 2019 - 2024. All rights reserved.