Вы можете просто отменить экземпляр класса, чем удалить весь класс, если вы хотите.
Отрывок из 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 после отмены регистрации текущей виртуальной машины. Этот подход будет соответствовать рекомендациям, предложенным «Laurent Bugnion» Here, и я бы сказал, что он хорошо знает свои собственные библиотеки, и вы не ошибетесь в этом.
Я помню, что авторское имя 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
Вы также получаете LifeTimeManager и сортировки, которые дают еще больший контроль. Да Единство - это накладные расходы по сравнению с SimpleIoC
, но это то, что технология может предоставить, когда это необходимо, чем писать код самостоятельно.
но в этом случае, когда я открываю одно и то же окно, ничего не работает (там нет виртуальной машины для просмотра) – Akrem
, вы можете перерегистрировать ViewModel 'SimpleIoc.Default.Register();', но так как я не используйте это, я не могу сказать, действительно ли это будет работать, или если это правильный способ сделать это так. –
Rudi
Я тестирую его, и он работает, но я не вижу, что хорошая практика сделать это для каждой виртуальной машины – Akrem