Mercurial > pub > ImplabNet
changeset 87:79badb3ed195 v2
minor fixes in the service locator class
author | cin |
---|---|
date | Mon, 06 Oct 2014 18:11:23 +0400 |
parents | b33832ab0262 |
children | c4877ae77cee |
files | Implab/ServiceLocator.cs |
diffstat | 1 files changed, 6 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- 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 @@ /// <typeparam name="T">Тип регистрируемого сервиса.</typeparam> /// <param name="activator">Фабрика для создания/получения объекта, предоставляющего сервис.</param> /// <param name = "cleanup">Метод для освобождения экземпляра сервиса, будет вызыван при освобождении сервис-локатора.</param> - /// <exception cref="InvalidOperationException">Указанный сервис уже зарегистрирован.</exception> /// <remarks>При освобождении сервис-локатора, сервисы полученные в результате активации также будут освобождены.</remarks> public void Register<T>(Func<T> activator, Action<T> cleanup) { Safe.ArgumentNotNull(activator, "activator"); @@ -196,12 +195,11 @@ } /// <summary> - /// Регистрирует объект, предоставляющий сервис. + /// Регистрирует объект, предоставляющий сервис. Повторная регистрация отменяет уже существующую. /// </summary> /// <typeparam name="T">Тип регистрируемого сервиса.</typeparam> /// <param name="service">Объект, предоставляющий сервис.</param> /// <param name="shared">Признак того, что объект является разделяемым и сервис-локатор не должен его освобождать.</param> - /// <exception cref="InvalidOperationException">Указанный сервис уже зарегистрирован.</exception> public void Register<T>(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); // убираем связанные записи