@@ -29,6 +29,7 @@ public class DependencyInjectionPlugin : IRuntimePlugin
2929 public void Initialize ( RuntimePluginEvents runtimePluginEvents , RuntimePluginParameters runtimePluginParameters , UnitTestProviderConfiguration unitTestProviderConfiguration )
3030 {
3131 runtimePluginEvents . CustomizeGlobalDependencies += CustomizeGlobalDependencies ;
32+ runtimePluginEvents . CustomizeTestThreadDependencies += CustomizeTestThreadDependenciesEventHandler ;
3233 runtimePluginEvents . CustomizeFeatureDependencies += CustomizeFeatureDependenciesEventHandler ;
3334 runtimePluginEvents . CustomizeScenarioDependencies += CustomizeScenarioDependenciesEventHandler ;
3435 }
@@ -45,21 +46,15 @@ private void CustomizeGlobalDependencies(object sender, CustomizeGlobalDependenc
4546 args . ObjectContainer . RegisterTypeAs < ServiceCollectionFinder , IServiceCollectionFinder > ( ) ;
4647 }
4748
48- // We store the (MS) service provider in the global (BoDi) container, we create it only once.
49- // It must be lazy (hence factory) because at this point we still don't have the bindings mapped.
50- args . ObjectContainer . RegisterFactoryAs < RootServiceProviderContainer > ( ( ) =>
51- {
52- var serviceCollectionFinder = args . ObjectContainer . Resolve < IServiceCollectionFinder > ( ) ;
53- var ( services , scoping ) = serviceCollectionFinder . GetServiceCollection ( ) ;
54-
55- RegisterProxyBindings ( args . ObjectContainer , services ) ;
56- return new RootServiceProviderContainer ( services . BuildServiceProvider ( ) , scoping ) ;
57- } ) ;
49+ var serviceCollectionFinder = args . ObjectContainer . Resolve < IServiceCollectionFinder > ( ) ;
50+ var lifetime = serviceCollectionFinder . GetServiceProviderLifetime ( ) ;
5851
59- args . ObjectContainer . RegisterFactoryAs < IServiceProvider > ( ( ) =>
52+ if ( lifetime == ServiceProviderLifetimeType . Global )
6053 {
61- return args . ObjectContainer . Resolve < RootServiceProviderContainer > ( ) . ServiceProvider ;
62- } ) ;
54+ args . ObjectContainer . RegisterFactoryAs < RootServiceProviderContainer > ( ( ) => BuildRootServiceProviderContainer ( args . ObjectContainer ) ) ;
55+ }
56+
57+ args . ObjectContainer . RegisterFactoryAs < IServiceProvider > ( c => c . Resolve < RootServiceProviderContainer > ( ) . ServiceProvider ) ;
6358
6459 // Will make sure DI scope is disposed.
6560 var lcEvents = args . ObjectContainer . Resolve < RuntimePluginTestExecutionLifecycleEvents > ( ) ;
@@ -70,8 +65,27 @@ private void CustomizeGlobalDependencies(object sender, CustomizeGlobalDependenc
7065 }
7166 }
7267
68+ private static void CustomizeTestThreadDependenciesEventHandler ( object sender , CustomizeTestThreadDependenciesEventArgs args )
69+ {
70+ var serviceCollectionFinder = args . ObjectContainer . Resolve < IServiceCollectionFinder > ( ) ;
71+ var lifetime = serviceCollectionFinder . GetServiceProviderLifetime ( ) ;
72+
73+ if ( lifetime == ServiceProviderLifetimeType . TestThread )
74+ {
75+ args . ObjectContainer . RegisterFactoryAs < RootServiceProviderContainer > ( ( ) => BuildRootServiceProviderContainer ( args . ObjectContainer ) ) ;
76+ }
77+ }
78+
7379 private static void CustomizeFeatureDependenciesEventHandler ( object sender , CustomizeFeatureDependenciesEventArgs args )
7480 {
81+ var serviceCollectionFinder = args . ObjectContainer . Resolve < IServiceCollectionFinder > ( ) ;
82+ var lifetime = serviceCollectionFinder . GetServiceProviderLifetime ( ) ;
83+
84+ if ( lifetime == ServiceProviderLifetimeType . Feature )
85+ {
86+ args . ObjectContainer . RegisterFactoryAs < RootServiceProviderContainer > ( ( ) => BuildRootServiceProviderContainer ( args . ObjectContainer ) ) ;
87+ }
88+
7589 // At this point we have the bindings, we can resolve the service provider, which will build it if it's the first time.
7690 var spContainer = args . ObjectContainer . Resolve < RootServiceProviderContainer > ( ) ;
7791
@@ -101,6 +115,14 @@ private static void AfterFeaturePluginLifecycleEventHandler(object sender, Runti
101115
102116 private static void CustomizeScenarioDependenciesEventHandler ( object sender , CustomizeScenarioDependenciesEventArgs args )
103117 {
118+ var serviceCollectionFinder = args . ObjectContainer . Resolve < IServiceCollectionFinder > ( ) ;
119+ var lifetime = serviceCollectionFinder . GetServiceProviderLifetime ( ) ;
120+
121+ if ( lifetime == ServiceProviderLifetimeType . Scenario )
122+ {
123+ args . ObjectContainer . RegisterFactoryAs < RootServiceProviderContainer > ( ( ) => BuildRootServiceProviderContainer ( args . ObjectContainer ) ) ;
124+ }
125+
104126 // At this point we have the bindings, we can resolve the service provider, which will build it if it's the first time.
105127 var spContainer = args . ObjectContainer . Resolve < RootServiceProviderContainer > ( ) ;
106128
@@ -127,6 +149,15 @@ private static void AfterScenarioPluginLifecycleEventHandler(object sender, Runt
127149 }
128150 }
129151
152+ private static RootServiceProviderContainer BuildRootServiceProviderContainer ( IObjectContainer container )
153+ {
154+ var serviceCollectionFinder = container . Resolve < IServiceCollectionFinder > ( ) ;
155+ var ( services , scoping ) = serviceCollectionFinder . GetServiceCollection ( ) ;
156+
157+ RegisterProxyBindings ( container , services ) ;
158+ return new RootServiceProviderContainer ( services . BuildServiceProvider ( ) , scoping ) ;
159+ }
160+
130161 private static void RegisterProxyBindings ( IObjectContainer objectContainer , IServiceCollection services )
131162 {
132163 // Required for DI of binding classes that want container injections
0 commit comments