c# - MVVM Light SimpleIoc Unregister 实例失败
问题描述
我正在使用 MVVM Light 开发 WPF 项目。此应用程序在系统托盘上运行并生成一个带有关联 ViewModel 的 Windows。
当用户关闭 Windows 时,我有一个 ViewModelLocator 来释放他关联的实例 ViewModel。同时有多个实例ViewModel,我不能删除所有实例,只删除与关闭窗口关联的一个
public class ViewModelLocator
{
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<CollectorViewModel>();
public static T GetNewInstance<T>(string uniqueKey)
{
var model = ServiceLocator.Current.GetInstance<T>(uniqueKey);
return model;
}
public static T GetInstance<T>()
{
return ServiceLocator.Current.GetInstance<T>();
}
public static void Cleanup(string uniqueKey)
{
SimpleIoc.Default.Unregister(uniqueKey);
}
}
public class CollectorViewModel
{
~CollectorViewModel()
{
//relase some resources
}
}
我试图通过这段代码释放实例。我确定我为实例传递了正确的 uniqueKey
SimpleIoc.Default.Unregister(uniqueKey);
第二次尝试没有效果。
SimpleIoc.Default.Unregister<CollectorViewModel>(myInstance);
但是当我检查时,它总是在那里。
SimpleIoc.Default.GetAllInstances(typeof(CollectorViewModel));
问题:如何释放实例?
解决方案
问题:如何释放实例?
如果您像这样注册类型:
SimpleIoc.Default.Register<CollectorViewModel>();
...您像这样取消注册,即没有任何密钥:
SimpleIoc.Default.Unregister<CollectorViewModel>();
这按预期工作:
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<CollectorViewModel>();
Debug.Assert(SimpleIoc.Default.GetAllInstances<CollectorViewModel>().Count() == 1);
SimpleIoc.Default.Unregister<CollectorViewModel>();
Debug.Assert(SimpleIoc.Default.GetAllInstances<CollectorViewModel>().Count() == 0);
如果你得到一个带有这样键的实例:
var instance = ServiceLocator.Current.GetInstance<CollectorViewModel>("xyz");
...您像这样取消注册此实例:
SimpleIoc.Default.Unregister<CollectorViewModel>("xyz");
这也可以按预期工作:
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<CollectorViewModel>();
Debug.Assert(SimpleIoc.Default.GetAllInstances<CollectorViewModel>().Count() == 1);
var instance = ServiceLocator.Current.GetInstance<CollectorViewModel>("xyz");
Debug.Assert(SimpleIoc.Default.GetAllInstances<CollectorViewModel>().Count() ==2);
SimpleIoc.Default.Unregister<CollectorViewModel>("xyz");
Debug.Assert(SimpleIoc.Default.GetAllInstances<CollectorViewModel>().Count() == 1);
推荐阅读
- angular - 时间敏感管道导致 ExpressionChangedAfterItHasBeenCheckedError
- javascript - 我是否通过循环遍历状态中的数组并在每个元素中创建新属性来破坏 Vue.js 的反应性?
- c# - Xamarin 从视图模型传递列表数据以进行视图绑定
- sqlite - 在一个事务中执行准备语句,而另一个事务在同一个数据库中运行
- php - 如何使用 file_put_contents 添加 php 数组?- PHP
- google-cloud-platform - 为什么云构建说我缺少我的项目所需的“compute.instances.create”权限?
- robotframework - 找不到 AutoItLibrary.MouseClick
- python - 将熊猫数据帧整数转换为日期时间的错误消息
- java - 如何在 Builder 设计模式中实现方法的条件可见性?
- python - 服务器在 vscode 上工作正常,但在 cmd 中不行