C# 如何重置IOC容器中的所有实例
我已经使用了一个C#WPF应用程序。我的应用程序使用C# 如何重置IOC容器中的所有实例,c#,wpf,inversion-of-control,mvvm-light,ioc-container,C#,Wpf,Inversion Of Control,Mvvm Light,Ioc Container,我已经使用了一个C#WPF应用程序。我的应用程序使用ViewModelLocator类在运行时定位viewmodels。ViewModelLocator使用了也随附的SimpleIoc类 以下是我的设想: 用户登录可以使用我的应用程序。注销时,我希望处置/重置/重新创建所有viewmodel实例,以便为下一个用户提供干净的环境 我试图在ViewModelLocator类中实现Cleanup()方法,但它不起作用。 不工作意味着(第二个)用户看到以前登录的用户的数据 第一次尝试: public s
ViewModelLocator
类在运行时定位viewmodels。ViewModelLocator
使用了也随附的SimpleIoc
类
以下是我的设想:
用户登录可以使用我的应用程序。注销时,我希望处置/重置/重新创建所有viewmodel实例,以便为下一个用户提供干净的环境
我试图在ViewModelLocator
类中实现Cleanup()
方法,但它不起作用。
不工作意味着(第二个)用户看到以前登录的用户的数据
第一次尝试:
public static void Cleanup()
{
SimpleIoc.Default.Reset();
}
第二次尝试:
public static void Cleanup()
{
SimpleIoc.Default.Unregister<LoginViewModel>();
SimpleIoc.Default.Unregister<TaskViewModel>();
SimpleIoc.Default.Register<LoginViewModel>();
SimpleIoc.Default.Register<TaskViewModel>();
}
publicstaticvoidcleanup()
{
SimpleIoc.Default.Unregister();
SimpleIoc.Default.Unregister();
SimpleIoc.Default.Register();
SimpleIoc.Default.Register();
}
第三次尝试(不是我想要的,但这是一个解决方法):
publicstaticvoidcleanup()
{
//我在viewmodels中实现了iClinup接口
//cleanup方法清除我的所有变量,例如:myCollection.clear();
SimpleIoc.Default.GetInstance().Cleanup();
SimpleIoc.Default.GetInstance().Cleanup();
}
如何重置我的
ViewModelLocator
类中的所有实例?如果需要,我愿意使用更高级的Ioc容器。与SimpleIoC一起使用
我将为唯一的键添加一个带有私有字符串后端的公共静态属性
差不多
private static string _currentKey = System.Guid.NewGuid().ToString();
public static string CurrentKey {
get {
return _currentKey;
}
private set {
_currentKey = value;
}
}
并具有使用当前密钥注销VM并最终重置当前密钥的清理方法(在每个应用程序重置阶段调用):
第三种方法有什么问题?对象不能被重用吗?我的构造函数中有一些逻辑为当前用户准备了一些东西。这再也不行了。我还必须编写大量需要维护的代码(每个viewmodel的清理方法)。对我来说,丢弃旧实例的方法似乎简单得多。如果这不适合你的架构,那么最好切换到另一个IOC。你知道其他IOC吗?我用过和。IOC并不难写,在这里有一个很好的比较。对我来说很有用,但我还是更喜欢更改IOC容器。然而,这是一个有效的解决方案,因此是正确的答案。@Joel如果您选择将IoC容器更改为更复杂的容器,您可以使用Unity,在这里您可以为您的实例提供一个外部控制的LifetimeManager
,它只允许GC垃圾收集VM的实例,只要您注销后没有任何内容对它有强引用。您还有多个管理器来管理对象的生命周期。然而,关于这一点,SimpleIoC
中绝对没有“错误”是的,我现在使用Unity。这不是对错的问题,只是SimpeIoC
不能满足我的所有需求。
private static string _currentKey = System.Guid.NewGuid().ToString();
public static string CurrentKey {
get {
return _currentKey;
}
private set {
_currentKey = value;
}
}
public static void Cleanup() {
SimpleIoc.Default.Unregister<LoginViewModel>(CurrentKey);
...
CurrentKey = System.Guid.NewGuid().ToString();
}
SimpleIoc.Default.GetInstance<LoginViewModel>(ViewModelLocator.CurrentKey);