diff --git a/Implab/ServiceLocator.cs b/Implab/ServiceLocator.cs --- a/Implab/ServiceLocator.cs +++ b/Implab/ServiceLocator.cs @@ -165,7 +165,6 @@ namespace Implab { /// Тип регистрируемого сервиса. /// Фабрика для создания/получения объекта, предоставляющего сервис. /// Метод для освобождения экземпляра сервиса, будет вызыван при освобождении сервис-локатора. - /// Указанный сервис уже зарегистрирован. /// При освобождении сервис-локатора, сервисы полученные в результате активации также будут освобождены. public void Register(Func activator, Action cleanup) { Safe.ArgumentNotNull(activator, "activator"); @@ -196,12 +195,11 @@ namespace Implab { } /// - /// Регистрирует объект, предоставляющий сервис. + /// Регистрирует объект, предоставляющий сервис. Повторная регистрация отменяет уже существующую. /// /// Тип регистрируемого сервиса. /// Объект, предоставляющий сервис. /// Признак того, что объект является разделяемым и сервис-локатор не должен его освобождать. - /// Указанный сервис уже зарегистрирован. public void Register(T service, bool shared) { Safe.ArgumentNotNull(service, "service"); @@ -219,9 +217,12 @@ namespace Implab { ServiceEntry se; if (m_services.TryGetValue(serviceType, out se)) { + if (se.origin != null) { + var pe = m_services[se.origin]; + pe.associated.Remove(serviceType); + } // освобождаем ресурсы - if (se.service != null && !se.shared) - ((IDisposable)se.service).Dispose(); + se.Dispose(); m_services.Remove(serviceType); // убираем связанные записи