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);
 
                 // убираем связанные записи