Mercurial > pub > ImplabNet
comparison Implab/ServiceLocator.cs @ 88:c4877ae77cee v2
ServiceLocator: fixed services cleanup
| author | cin |
|---|---|
| date | Tue, 07 Oct 2014 10:58:38 +0400 |
| parents | 79badb3ed195 |
| children | 8beee0d11de6 |
comparison
equal
deleted
inserted
replaced
| 87:79badb3ed195 | 88:c4877ae77cee |
|---|---|
| 18 #region IDisposable implementation | 18 #region IDisposable implementation |
| 19 | 19 |
| 20 public void Dispose() { | 20 public void Dispose() { |
| 21 if (shared) | 21 if (shared) |
| 22 return; | 22 return; |
| 23 if (cleanup != null) | 23 if (cleanup != null) { |
| 24 cleanup(service); | 24 if (service != null) |
| 25 else { | 25 cleanup(service); |
| 26 var d = service as IDisposable; | 26 } else |
| 27 if (d != null) | 27 Safe.Dispose(service); |
| 28 d.Dispose(); | |
| 29 } | |
| 30 } | 28 } |
| 31 | 29 |
| 32 #endregion | 30 #endregion |
| 33 } | 31 } |
| 34 | 32 |
| 171 | 169 |
| 172 AssertNotDisposed(); | 170 AssertNotDisposed(); |
| 173 | 171 |
| 174 Unregister(typeof(T)); | 172 Unregister(typeof(T)); |
| 175 | 173 |
| 176 m_services[typeof(T)] = new ServiceEntry { | 174 var serviceEntry = new ServiceEntry(); |
| 177 activator = () => activator(), | 175 serviceEntry.activator = () => activator(); |
| 178 cleanup = instance => cleanup((T)instance) | 176 if (cleanup != null) |
| 179 }; | 177 serviceEntry.cleanup = instance => cleanup((T)instance); |
| 178 m_services[typeof(T)] = serviceEntry; | |
| 180 } | 179 } |
| 181 | 180 |
| 182 public void Register<T>(Func<T> activator) { | 181 public void Register<T>(Func<T> activator) { |
| 183 Register(activator, null); | 182 Register(activator, null); |
| 184 } | 183 } |
