簡體   English   中英

MVVM Light SimpleIoc取消注冊實例失敗

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM