MVVM Light SimpleIoc 注销实例失败
MVVM Light SimpleIoc Unregister instance failed
我正在使用 MVVM Light 开发一个 WPF 项目。此应用程序在系统托盘上运行并生成一个 Windows 与一个 ViewModel 相关联。
当用户关闭时Windows,我有一个ViewModelLocator 来释放他关联的实例ViewModel。
同时存在多个实例 ViewModel,我无法删除所有实例,只能删除与 closed Window
关联的实例
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));
问题:如何释放实例?
The question: How to release the instance?
如果你这样注册类型:
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);
这行代码造成了问题,因为它想要 exact 类型,实例的键不足以让 SimpleIoc 找到实例。
SimpleIoc.Default.Unregister(uniqueKey);
例如,在我的项目中,
public class A
public class B: A
如果你想释放一个实例B,你必须这样做:
SimpleIoc.Default.Unregister<B>(unique_key_of_instance_B);
即使你使用 class A
也不行
SimpleIoc.Default.Unregister(unique_key_of_instance_B);
因此,要更新 ViewModelLocator class:
public static void Cleanup<T>(string uniqueKey) where T:class
{
SimpleIoc.Default.Unregister<T>(uniqueKey);
}
我正在使用 MVVM Light 开发一个 WPF 项目。此应用程序在系统托盘上运行并生成一个 Windows 与一个 ViewModel 相关联。
当用户关闭时Windows,我有一个ViewModelLocator 来释放他关联的实例ViewModel。 同时存在多个实例 ViewModel,我无法删除所有实例,只能删除与 closed Window
关联的实例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));
问题:如何释放实例?
The question: How to release the instance?
如果你这样注册类型:
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);
这行代码造成了问题,因为它想要 exact 类型,实例的键不足以让 SimpleIoc 找到实例。
SimpleIoc.Default.Unregister(uniqueKey);
例如,在我的项目中,
public class A
public class B: A
如果你想释放一个实例B,你必须这样做:
SimpleIoc.Default.Unregister<B>(unique_key_of_instance_B);
即使你使用 class A
也不行SimpleIoc.Default.Unregister(unique_key_of_instance_B);
因此,要更新 ViewModelLocator class:
public static void Cleanup<T>(string uniqueKey) where T:class
{
SimpleIoc.Default.Unregister<T>(uniqueKey);
}