Mercurial > pub > ImplabNet
comparison Implab/ServiceLocator.cs @ 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 |
comparison
equal
deleted
inserted
replaced
86:b33832ab0262 | 87:79badb3ed195 |
---|---|
163 /// Регистрирует фабрику для активации сервиса по первому требованию. | 163 /// Регистрирует фабрику для активации сервиса по первому требованию. |
164 /// </summary> | 164 /// </summary> |
165 /// <typeparam name="T">Тип регистрируемого сервиса.</typeparam> | 165 /// <typeparam name="T">Тип регистрируемого сервиса.</typeparam> |
166 /// <param name="activator">Фабрика для создания/получения объекта, предоставляющего сервис.</param> | 166 /// <param name="activator">Фабрика для создания/получения объекта, предоставляющего сервис.</param> |
167 /// <param name = "cleanup">Метод для освобождения экземпляра сервиса, будет вызыван при освобождении сервис-локатора.</param> | 167 /// <param name = "cleanup">Метод для освобождения экземпляра сервиса, будет вызыван при освобождении сервис-локатора.</param> |
168 /// <exception cref="InvalidOperationException">Указанный сервис уже зарегистрирован.</exception> | |
169 /// <remarks>При освобождении сервис-локатора, сервисы полученные в результате активации также будут освобождены.</remarks> | 168 /// <remarks>При освобождении сервис-локатора, сервисы полученные в результате активации также будут освобождены.</remarks> |
170 public void Register<T>(Func<T> activator, Action<T> cleanup) { | 169 public void Register<T>(Func<T> activator, Action<T> cleanup) { |
171 Safe.ArgumentNotNull(activator, "activator"); | 170 Safe.ArgumentNotNull(activator, "activator"); |
172 | 171 |
173 AssertNotDisposed(); | 172 AssertNotDisposed(); |
194 public void Register<T>(T service) { | 193 public void Register<T>(T service) { |
195 Register(service, true); | 194 Register(service, true); |
196 } | 195 } |
197 | 196 |
198 /// <summary> | 197 /// <summary> |
199 /// Регистрирует объект, предоставляющий сервис. | 198 /// Регистрирует объект, предоставляющий сервис. Повторная регистрация отменяет уже существующую. |
200 /// </summary> | 199 /// </summary> |
201 /// <typeparam name="T">Тип регистрируемого сервиса.</typeparam> | 200 /// <typeparam name="T">Тип регистрируемого сервиса.</typeparam> |
202 /// <param name="service">Объект, предоставляющий сервис.</param> | 201 /// <param name="service">Объект, предоставляющий сервис.</param> |
203 /// <param name="shared">Признак того, что объект является разделяемым и сервис-локатор не должен его освобождать.</param> | 202 /// <param name="shared">Признак того, что объект является разделяемым и сервис-локатор не должен его освобождать.</param> |
204 /// <exception cref="InvalidOperationException">Указанный сервис уже зарегистрирован.</exception> | |
205 public void Register<T>(T service, bool shared) { | 203 public void Register<T>(T service, bool shared) { |
206 Safe.ArgumentNotNull(service, "service"); | 204 Safe.ArgumentNotNull(service, "service"); |
207 | 205 |
208 AssertNotDisposed(); | 206 AssertNotDisposed(); |
209 | 207 |
217 | 215 |
218 AssertNotDisposed(); | 216 AssertNotDisposed(); |
219 | 217 |
220 ServiceEntry se; | 218 ServiceEntry se; |
221 if (m_services.TryGetValue(serviceType, out se)) { | 219 if (m_services.TryGetValue(serviceType, out se)) { |
220 if (se.origin != null) { | |
221 var pe = m_services[se.origin]; | |
222 pe.associated.Remove(serviceType); | |
223 } | |
222 // освобождаем ресурсы | 224 // освобождаем ресурсы |
223 if (se.service != null && !se.shared) | 225 se.Dispose(); |
224 ((IDisposable)se.service).Dispose(); | |
225 m_services.Remove(serviceType); | 226 m_services.Remove(serviceType); |
226 | 227 |
227 // убираем связанные записи | 228 // убираем связанные записи |
228 if (se.associated != null) | 229 if (se.associated != null) |
229 foreach (var item in se.associated) | 230 foreach (var item in se.associated) |