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