C# MVVM Light SimpleIoc注销实例失败

C# MVVM Light SimpleIoc注销实例失败,c#,wpf,mvvm-light,C#,Wpf,Mvvm Light,我正在使用MVVM Light进行WPF项目。此应用程序在系统托盘上运行,并生成与ViewModel关联的窗口 当用户关闭窗口时,我有一个ViewModelLocator来释放其关联的实例ViewModel。 同时存在多个实例ViewModel,我无法删除所有实例,仅删除与关闭窗口关联的实例 public class ViewModelLocator { public ViewModelLocator() { ServiceLoca

我正在使用MVVM Light进行WPF项目。此应用程序在系统托盘上运行,并生成与ViewModel关联的窗口

当用户关闭窗口时,我有一个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
        }
}
第二次尝试没有效果

SimpleIoc.Default.Unregister<CollectorViewModel>(myInstance); 
问题是:如何释放实例

问题是:如何释放实例

如果按如下方式注册类型:

SimpleIoc.Default.Register<CollectorViewModel>();
var instance = ServiceLocator.Current.GetInstance<CollectorViewModel>("xyz");
SimpleIoc.Default.Unregister<CollectorViewModel>("xyz");
simpleoc.Default.Register();
…您可以这样取消注册,即不使用任何密钥:

SimpleIoc.Default.Unregister<CollectorViewModel>();
SimpleIoc.Default.Unregister();
这与预期的效果一样:

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);
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);
ServiceLocator.SetLocatorProvider(()=>SimpleIoc.Default);
SimpleIoc.Default.Register();
Assert(SimpleIoc.Default.GetAllInstances().Count()=1);
SimpleIoc.Default.Unregister();
Assert(SimpleIoc.Default.GetAllInstances().Count()=0);
如果您得到一个具有如下键的实例:

SimpleIoc.Default.Register<CollectorViewModel>();
var instance = ServiceLocator.Current.GetInstance<CollectorViewModel>("xyz");
SimpleIoc.Default.Unregister<CollectorViewModel>("xyz");
var instance=ServiceLocator.Current.GetInstance(“xyz”);
…您可以按如下方式注销此实例:

SimpleIoc.Default.Register<CollectorViewModel>();
var instance = ServiceLocator.Current.GetInstance<CollectorViewModel>("xyz");
SimpleIoc.Default.Unregister<CollectorViewModel>("xyz");
simpleoc.Default.Unregister(“xyz”);
这也如预期的那样起作用:

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);
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);
ServiceLocator.SetLocatorProvider(()=>SimpleIoc.Default);
SimpleIoc.Default.Register();
Assert(SimpleIoc.Default.GetAllInstances().Count()=1);
var instance=ServiceLocator.Current.GetInstance(“xyz”);
Assert(SimpleIoc.Default.GetAllInstances().Count()=2);
SimpleIoc.Default.Unregister(“xyz”);
Assert(SimpleIoc.Default.GetAllInstances().Count()=1);

这行代码产生了问题,因为它想要一个精确的类型,实例的键不足以让SimpleIoc找到实例

SimpleIoc.Default.Unregister(uniqueKey);
比如,在我的项目中

public class A

public class B: A
如果要释放B的实例,必须执行以下操作:

SimpleIoc.Default.Unregister<B>(unique_key_of_instance_B);
SimpleIoc.Default.Unregister(实例B的唯一密钥);
即使你用A级也不行

SimpleIoc.Default.Unregister(实例B的唯一密钥)

因此,要更新ViewModelLocator类:

public static void Cleanup<T>(string uniqueKey) where T:class
{
      SimpleIoc.Default.Unregister<T>(uniqueKey);
}
publicstaticvoidcleanup(字符串uniqueKey),其中T:class
{
SimpleIoc.Default.Unregister(uniqueKey);
}

我认为如果我遵循您的代码,它将释放CollectorViewModel的所有实例,我只想释放指定了UniKey的实例…在示例中,我使用SimpleIoc.Default.Register()注册CollectorViewModel类型,并使用GetNewInstance(字符串uniqueKey)生成新实例。。。我无法全部删除,因为ViewModel与windows关联。如果Windows关闭,我将释放他的ViewModel。有多个窗口同时打开…无法调用finalizer,因为ViewModel总是在SimpleIoc中引用事实上,当我调用GetNewInstance时,SimpleIoc中有一个已注册类型的实例,所以要回答您关于如何注册实例的问题,我无法回答。它是自动添加的。我的问题是如何删除单个实例。。。。不是所有注册类型的实例。这和我已经建议的解决方案有什么区别?您应该像我在回答中提到的那样指定类型参数和键。