如何重置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);