# HG changeset patch # User cin # Date 1412604683 -14400 # Node ID 79badb3ed1950cb021161335d0bd3fab40395ff6 # Parent b33832ab02623f75e705ad81641eaab0635014c4 minor fixes in the service locator class diff -r b33832ab0262 -r 79badb3ed195 Implab/ServiceLocator.cs --- a/Implab/ServiceLocator.cs Mon Oct 06 03:41:17 2014 +0400 +++ b/Implab/ServiceLocator.cs Mon Oct 06 18:11:23 2014 +0400 @@ -165,7 +165,6 @@ /// Тип регистрируемого сервиса. /// Фабрика для создания/получения объекта, предоставляющего сервис. /// Метод для освобождения экземпляра сервиса, будет вызыван при освобождении сервис-локатора. - /// Указанный сервис уже зарегистрирован. /// При освобождении сервис-локатора, сервисы полученные в результате активации также будут освобождены. public void Register(Func activator, Action cleanup) { Safe.ArgumentNotNull(activator, "activator"); @@ -196,12 +195,11 @@ } /// - /// Регистрирует объект, предоставляющий сервис. + /// Регистрирует объект, предоставляющий сервис. Повторная регистрация отменяет уже существующую. /// /// Тип регистрируемого сервиса. /// Объект, предоставляющий сервис. /// Признак того, что объект является разделяемым и сервис-локатор не должен его освобождать. - /// Указанный сервис уже зарегистрирован. public void Register(T service, bool shared) { Safe.ArgumentNotNull(service, "service"); @@ -219,9 +217,12 @@ 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); // убираем связанные записи