如何重置IOC容器中的所有实例

我使用MVVM Light框架制作了一个C#WPF应用程序。 我的应用程序使用ViewModelLocator类在运行时定位视图模型。 ViewModelLocator使用了与MVVM Light框架一起提供的SimpleIoc类。

这是我的场景:用户登录可以使用我的应用程序。 在注销时,我想处置/重置/重新创建所有viewmodel实例,以便为下一个用户提供干净的环境。

我试图在ViewModelLocator类中实现Cleanup()方法,但它无法正常工作。 不工作意味着(第二个)用户看到之前登录的用户的数据。

第一次尝试:

 public static void Cleanup() { SimpleIoc.Default.Reset(); } 

第二次尝试:

 public static void Cleanup() { SimpleIoc.Default.Unregister(); SimpleIoc.Default.Unregister(); SimpleIoc.Default.Register(); SimpleIoc.Default.Register(); } 

第三次尝试(不是我想要的,但它是一种解决方法):

 public static void Cleanup() { // I implemented the ICleanup interface in my viewmodels // The cleanup method clears all my variables eg: myCollection.clear(); SimpleIoc.Default.GetInstance().Cleanup(); SimpleIoc.Default.GetInstance().Cleanup(); } 

如何重置ViewModelLocator类中的所有实例? 如果有必要,我愿意使用更高级的Ioc容器。

使用SimpleIoC

我将为一个唯一的Key添加一个带有私有字符串后端的公共静态属性

就像是

 private static string _currentKey = System.Guid.NewGuid().ToString(); public static string CurrentKey { get { return _currentKey; } private set { _currentKey = value; } } 

并使用清理方法使用当前密钥注销VM,最后重置当前密钥(在每个应用程序重置阶段调用):

 public static void Cleanup() { SimpleIoc.Default.Unregister(CurrentKey); ... CurrentKey = System.Guid.NewGuid().ToString(); } 

当调用GetInstance(...)只需传入静态CurrentKey

 SimpleIoc.Default.GetInstance(ViewModelLocator.CurrentKey);