Wpf usercontrol中的Mvvm light SimpleIoC

Wpf usercontrol中的Mvvm light SimpleIoC,wpf,user-controls,mvvm-light,simpleioc,Wpf,User Controls,Mvvm Light,Simpleioc,我希望有人能为我的用例提供一些最佳实践 我正在wpf用户控件中使用mvvm light和simpleIoC容器。我向它注册我的模型和视图模型、数据服务和设计时服务(非常符合mvvm轻型示例代码) 我看到的SimpleIoC容器使用示例似乎总是将容器视为GalaSoft命名空间的静态/全局容器 但是,如果我想在同一个应用程序中创建WPF控件的两个实例,我当然希望每个用户控件都有自己的一组VM和模型实例。所以基本上是它自己的一组SimpleIoC注册实例。当默认IoC容器似乎是静态对象时,我如何才能

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

我正在wpf用户控件中使用mvvm light和simpleIoC容器。我向它注册我的模型和视图模型、数据服务和设计时服务(非常符合mvvm轻型示例代码)

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


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

工厂模式就是为了解决这个问题而设计的,您创建一个类来创建控件视图模型,然后将其注入

更好地分离关注点

当默认的IoC容器似乎是静态对象时,我如何才能最好地实现这一点

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

用户控件A:

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

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

不过,还有一个潜在的问题。如果您获取了100个不同版本的Instance,那么它们在应用程序的整个生命周期内都将保存在内存中

如果这只是几个例子,你可能还可以

再多一些,您可能最好使用更复杂的di容器。SimpleIoC仅用于简单的用例

但是,在获取实例时可以使用工厂方法。这不符合我的口味,但如果你真的想使用SimiOOC,那就要考虑一下。 你可以在这里阅读更多劳伦特·布尼翁的作品


谢谢,你能提供一些例子或参考吗?我在谷歌上搜索了工厂模式,但我不知道我是如何使用它的,这样两个用户控件就可以获得自己的VM实例集,并且在使用GetInstance(vmKeyString)时可以获得正确的实例?是的,这部分是有效的。基本上,我确实可以在viewmodellocator中创建容器的新实例,并向其注册VM。但是我如何让构造函数依赖注入工作呢?@Johan。视情况而定。目前它是如何工作的。您的用户控件在这里的什么位置?在回答您的原始问题后,请不要在评论栏中提出其他问题。这可能有效,但从“纯粹的”国际奥委会的角度来看,这看起来不太好。我是说,为每个用户控件创建一个新容器?不过,我知道SimpleIoc中可能没有更好的方法(工厂、生命周期范围)。谢谢,这很好地解释了这一点。所以MarkFeldman关于使用工厂模式的回答只是提供一个Guid或类似的,并为该Guid生成一个实例。因此,如果我使用工厂方法,该方法本身就必须保留缓存的实例?似乎有很多代码“应该”很简单。我认为他建议使用工厂而不是di容器。是的。使用更复杂的di容器,您似乎想做的事情要简单得多。Simple只有在足够的情况下才是好的。问题的答案是创建一个单独的SimpleIoC实例。这解决了我的问题,因为VMLocator也不是一个单例。但我对这篇文章投了更高的票,因为它提供了更多有用的细节。谢谢
SimpleIoc containerB = new SimpleIoc();
...