Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何重置IOC容器中的所有实例_C#_Wpf_Inversion Of Control_Mvvm Light_Ioc Container - Fatal编程技术网

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

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

我已经使用了一个C#WPF应用程序。我的应用程序使用
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);