如果需要,您可以只注销该类的一个实例,而不是删除整个类。
片段来自SimpleIoc.cs
:
//
// Summary:
// Removes the instance corresponding to the given key from the cache. The class
// itself remains registered and can be used to create other instances.
//
// Parameters:
// key:
// The key corresponding to the instance that must be removed.
//
// Type parameters:
// TClass:
// The type of the instance to be removed.
public void Unregister<TClass>(string key) where TClass : class;
请记住在每次解析时获取该类的新实例,SimpleIoC
我们需要在其中指定一个唯一键GetInstance()
因此,ViewModelLocator.cs
请保留对已使用的引用currentKey
并在下次尝试时取消注册,例如:
private string _currentScanVMKey;
public ScanViewModel Scan
{
get {
if (!string.IsNullOrEmpty(_currentScanVMKey))
SimpleIoc.Default.Unregister(_currentScanVMKey);
_currentScanVMKey = Guid.NewGuid().ToString();
return ServiceLocator.Current.GetInstance<ScanViewModel>(_currentScanVMKey);
}
}
这样,每次向 VMLocator 查询Scan
新 VM 时,都会在取消注册当前 VM 后返回。这种方法将符合“Laurent Bugnion”在这里提出的指导方针,我认为他非常了解自己的库,这样做不会出错。
我记得 MVVM Light 在某处的作者状态SimpleIoC
是为了让开发人员熟悉 IOC 原则并让他们自己探索。它非常适合简单的项目,如果您确实希望对 VM 注入进行越来越多的控制,那么我建议您查看Unity之类的东西,在这种情况下,您的当前情况很容易得到解决,因为您可以去
// _container is a UnityContainer
_container.RegisterType<ScanViewModel>(); // Defaults to new instance each time when resolved
_container.RegisterInstance<ScanViewModel>(); // Defaults to a singleton approach
您还可以获得 LifeTimeManagers 和提供更大控制权的排序。是的,与 相比,Unity 是一种开销SimpleIoC
,但这是该技术在需要时可以提供的,而不必自己编写代码。