@@ -15,7 +15,7 @@ namespace Xbim.Common.Configuration
1515 /// <remarks>the service delays building of the internal service provider when not configured to support
1616 /// late configutation of the services.
1717 /// In this case the service provision is delagated to <see cref="InternalServiceProvider"/></remarks>
18- public class XbimServices
18+ public class XbimServices : IDisposable
1919 {
2020
2121 private XbimServices ( )
@@ -40,6 +40,7 @@ public static XbimServices CreateInstanceInternal()
4040
4141 static Lazy < XbimServices > lazySingleton = new Lazy < XbimServices > ( ( ) => new XbimServices ( ) ) ;
4242 Lazy < IServiceProvider > serviceProviderBuilder ;
43+ private bool disposedValue ;
4344
4445 /// <summary>
4546 /// The shared instance of all Xbim Services
@@ -140,13 +141,8 @@ internal void Rebuild()
140141 {
141142 servicesCollection . Clear ( ) ;
142143 isBuilt = false ;
143-
144- if ( serviceProviderBuilder != null &&
145- serviceProviderBuilder . IsValueCreated &&
146- serviceProviderBuilder . Value is ServiceProvider sp )
147- {
148- sp . Dispose ( ) ;
149- }
144+
145+ DisposeServiceProvider ( ) ;
150146 //rebuild the Lazy so IServiceProvider is rebuilt next time
151147 serviceProviderBuilder = new Lazy < IServiceProvider > ( ( ) =>
152148 {
@@ -157,6 +153,39 @@ internal void Rebuild()
157153 } ) ;
158154 }
159155
160-
156+ private void DisposeServiceProvider ( )
157+ {
158+ if ( serviceProviderBuilder != null &&
159+ serviceProviderBuilder . IsValueCreated &&
160+ serviceProviderBuilder . Value is ServiceProvider sp )
161+ {
162+ sp . Dispose ( ) ;
163+ }
164+ }
165+
166+ protected virtual void Dispose ( bool disposing )
167+ {
168+ if ( ! disposedValue )
169+ {
170+ if ( disposing )
171+ {
172+ Rebuild ( ) ;
173+ }
174+
175+ disposedValue = true ;
176+ }
177+ }
178+
179+ /// <summary>
180+ /// Disposes of the XbimServices and resources held by any <see cref="IServiceProvider"/> in use.
181+ /// Note: Not for general usage. This is typically used to reset the singleton DI between tests
182+ /// or to ensure orderly release of resources at application close.
183+ /// </summary>
184+ public void Dispose ( )
185+ {
186+ // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
187+ Dispose ( disposing : true ) ;
188+ GC . SuppressFinalize ( this ) ;
189+ }
161190 }
162191}
0 commit comments