11using System ;
2+ using System . Collections . Generic ;
3+ using System . Linq ;
24using Microsoft . Extensions . DependencyInjection ;
35using Microsoft . Extensions . DependencyInjection . Specification ;
6+ using Microsoft . Extensions . DependencyInjection . Specification . Fakes ;
7+ using Xunit ;
48
59namespace Unity . Microsoft . DependencyInjection . Tests
610{
@@ -10,5 +14,34 @@ protected override IServiceProvider CreateServiceProvider(IServiceCollection ser
1014 {
1115 return ServiceProvider . ConfigureServices ( serviceCollection ) ;
1216 }
17+
18+ [ Fact ]
19+ public void Disposes_InReverseOrderOfCreation ( )
20+ {
21+ TestServiceCollection serviceCollection = new TestServiceCollection ( ) ;
22+ ServiceCollectionServiceExtensions . AddSingleton < FakeDisposeCallback > ( serviceCollection ) ;
23+ ServiceCollectionServiceExtensions . AddTransient < IFakeOuterService , FakeDisposableCallbackOuterService > ( serviceCollection ) ;
24+ ServiceCollectionServiceExtensions . AddSingleton < IFakeMultipleService , FakeDisposableCallbackInnerService > ( serviceCollection ) ;
25+ ServiceCollectionServiceExtensions . AddScoped < IFakeMultipleService , FakeDisposableCallbackInnerService > ( serviceCollection ) ;
26+ ServiceCollectionServiceExtensions . AddTransient < IFakeMultipleService , FakeDisposableCallbackInnerService > ( serviceCollection ) ;
27+ ServiceCollectionServiceExtensions . AddSingleton < IFakeService , FakeDisposableCallbackInnerService > ( serviceCollection ) ;
28+ IServiceProvider provider1 = this . CreateServiceProvider ( serviceCollection ) ;
29+ FakeDisposeCallback callback = ServiceProviderServiceExtensions . GetService < FakeDisposeCallback > ( provider1 ) ;
30+ IFakeOuterService service = ServiceProviderServiceExtensions . GetService < IFakeOuterService > ( provider1 ) ;
31+ ( ( IDisposable ) provider1 ) . Dispose ( ) ;
32+ Assert . Equal < object > ( service , callback . Disposed [ 0 ] ) ;
33+ Assert . Equal < IFakeMultipleService > ( Enumerable . Reverse < IFakeMultipleService > ( service . MultipleServices ) ,
34+ Enumerable . OfType < IFakeMultipleService > ( Enumerable . Take < object > ( Enumerable . Skip < object > ( ( IEnumerable < object > ) callback . Disposed , 1 ) , 3 ) ) ) ;
35+ Assert . Equal < object > ( service . SingleService , callback . Disposed [ 4 ] ) ;
36+ }
37+
38+ internal class TestServiceCollection : List < ServiceDescriptor > ,
39+ IServiceCollection ,
40+ IList < ServiceDescriptor > ,
41+ ICollection < ServiceDescriptor > ,
42+ IEnumerable < ServiceDescriptor >
43+ {
44+ }
45+
1346 }
1447}
0 commit comments