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)