comparison Implab/ServiceLocator.cs @ 68:9dd6a896a385

ServiceLocator: small refactoring, GetService method is made virtual
author cin
date Thu, 28 Aug 2014 02:28:00 +0400
parents fe33f4e02ad5
children 48763f3b5db8
comparison
equal deleted inserted replaced
67:b4c2454d208e 68:9dd6a896a385
39 /// <param name="service">Объект реализующий сервис, или <c>default(T)</c> если такового нет.</param> 39 /// <param name="service">Объект реализующий сервис, или <c>default(T)</c> если такового нет.</param>
40 /// <returns><c>true</c> - сервис найден, <c>false</c> - сервис не зарегистрирован.</returns> 40 /// <returns><c>true</c> - сервис найден, <c>false</c> - сервис не зарегистрирован.</returns>
41 public bool TryGetService<T>(out T service) { 41 public bool TryGetService<T>(out T service) {
42 AssertNotDisposed(); 42 AssertNotDisposed();
43 43
44 try { 44 var result = GetService(typeof(T), false);
45 service = GetService<T>(); 45 if (result == null) {
46 return true; 46 service = default(T);
47 } catch(KeyNotFoundException) { 47 return false;
48 service = default(T); 48 } else {
49 return false; 49 service = (T)result;
50 } 50 return true;
51 }
51 } 52 }
52 53
53 /// <summary> 54 /// <summary>
54 /// Получает объект предоставляющий сервис <paramref name="serviceType"/> 55 /// Получает объект предоставляющий сервис <paramref name="serviceType"/>
55 /// </summary> 56 /// </summary>
56 /// <param name="serviceType">Тип запрашиваемого сервиса</param> 57 /// <param name="serviceType">Тип запрашиваемого сервиса</param>
57 /// <returns>Объект, реализующий сервис</returns> 58 /// <returns>Объект, реализующий сервис</returns>
58 /// <exception cref="KeyNotFoundException">Сервис не зарегистрирован</exception> 59 /// <exception cref="KeyNotFoundException">Сервис не зарегистрирован</exception>
59 public object GetService(Type serviceType) { 60 public object GetService(Type serviceType) {
61 return GetService (serviceType, true);
62 }
63
64 public virtual object GetService(Type serviceType, bool throwOnError) {
60 if (serviceType == null) 65 if (serviceType == null)
61 throw new ArgumentNullException("serviceType"); 66 throw new ArgumentNullException("serviceType");
62 AssertNotDisposed(); 67 AssertNotDisposed();
63 68
64 ServiceEntry se; 69 ServiceEntry se;
117 m_services[serviceType] = se; 122 m_services[serviceType] = se;
118 123
119 return se.service; 124 return se.service;
120 } 125 }
121 126
122 throw new Exception("Unable to create a service instance"); 127 if (throwOnError)
128 throw new Exception("Unable to create a service instance");
129 return null;
123 } 130 }
124 131
125 /// <summary> 132 /// <summary>
126 /// Регистрирует фабрику для активации сервиса по первому требованию. 133 /// Регистрирует фабрику для активации сервиса по первому требованию.
127 /// </summary> 134 /// </summary>