Mercurial > pub > ImplabNet
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> |