[英]MVVM Light SimpleIoc Unregister instance failed
我正在使用MVVM Light進行WPF項目。 該應用程序在系統托盤上運行,並生成帶有ViewModel關聯的Windows。
當用戶關閉Windows時,我有一個ViewModelLocator來釋放他的實例ViewModel關聯。 同時存在多實例ViewModel,我無法刪除所有實例,僅刪除與關閉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));
問題:如何釋放實例?
問題:如何釋放實例?
如果您這樣注冊類型:
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);
此行代碼會產生問題,因為它想要一個確切的類型,實例的鍵不足以讓SimpleIoc查找實例。
SimpleIoc.Default.Unregister(uniqueKey);
例如,在我的項目中
public class A
public class B: A
如果要釋放B的實例,則必須執行以下操作:
SimpleIoc.Default.Unregister<B>(unique_key_of_instance_B);
即使您使用A類也無法使用
SimpleIoc.Default.Unregister(unique_key_of_instance_B);
因此,要更新ViewModelLocator類:
public static void Cleanup<T>(string uniqueKey) where T:class
{
SimpleIoc.Default.Unregister<T>(uniqueKey);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.