首页 > 解决方案 > 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));

问题:如何释放实例?

标签: c#wpfmvvm-light

解决方案


问题:如何释放实例?

如果您像这样注册类型:

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);

推荐阅读