Skip to content

Commit d3f9d86

Browse files
lord-executoreerhardt
authored andcommitted
Explicit test for injecting scoped IServiceProvider (#63225)
- Refactored existing singleton test to avoid testing service provider reference equality
1 parent ec4d084 commit d3f9d86

File tree

1 file changed

+25
-11
lines changed

1 file changed

+25
-11
lines changed

src/libraries/Microsoft.Extensions.DependencyInjection.Specification.Tests/src/DependencyInjectionSpecificationTests.cs

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -168,31 +168,45 @@ public void SingletonServiceCanBeResolvedFromScope()
168168
{
169169
// Arrange
170170
var collection = new TestServiceCollection();
171+
// When resolved from the root service provider / root scope, the scoped IFakeService effectively
172+
// also becomes a singleton.
173+
collection.AddScoped<IFakeService, FakeService>();
171174
collection.AddSingleton<ClassWithServiceProvider>();
172175
var provider = CreateServiceProvider(collection);
173176

174177
// Act
175-
IServiceProvider scopedSp1 = null;
176-
IServiceProvider scopedSp2 = null;
177-
ClassWithServiceProvider instance1 = null;
178-
ClassWithServiceProvider instance2 = null;
178+
IFakeService fakeServiceFromScope1 = null;
179+
IFakeService scopedFakeServiceFromScope1 = null;
180+
IFakeService fakeServiceFromScope2 = null;
181+
IFakeService scopedFakeServiceFromScope2 = null;
179182

180183
using (var scope1 = provider.CreateScope())
181184
{
182-
scopedSp1 = scope1.ServiceProvider;
183-
instance1 = scope1.ServiceProvider.GetRequiredService<ClassWithServiceProvider>();
185+
scopedFakeServiceFromScope1 = scope1.ServiceProvider.GetRequiredService<IFakeService>();
186+
var serviceWithProvider = scope1.ServiceProvider.GetRequiredService<ClassWithServiceProvider>();
187+
// resolved through singleton, the fake service should be scoped to root scope
188+
fakeServiceFromScope1 = serviceWithProvider.ServiceProvider.GetRequiredService<IFakeService>();
184189
}
185190

186191
using (var scope2 = provider.CreateScope())
187192
{
188-
scopedSp2 = scope2.ServiceProvider;
189-
instance2 = scope2.ServiceProvider.GetRequiredService<ClassWithServiceProvider>();
193+
scopedFakeServiceFromScope2 = scope2.ServiceProvider.GetRequiredService<IFakeService>();
194+
var serviceWithProvider = scope2.ServiceProvider.GetRequiredService<ClassWithServiceProvider>();
195+
// resolved through singleton, the fake service should be scoped to root scope
196+
fakeServiceFromScope2 = serviceWithProvider.ServiceProvider.GetRequiredService<IFakeService>();
190197
}
191198

199+
IFakeService fakeServiceFromRootScope = provider.GetRequiredService<IFakeService>();
200+
192201
// Assert
193-
Assert.Same(instance1.ServiceProvider, instance2.ServiceProvider);
194-
Assert.NotSame(instance1.ServiceProvider, scopedSp1);
195-
Assert.NotSame(instance2.ServiceProvider, scopedSp2);
202+
// resolved through singleton should be the same and same with resolved from root scope
203+
Assert.Same(fakeServiceFromScope1, fakeServiceFromScope2);
204+
Assert.Same(fakeServiceFromRootScope, fakeServiceFromScope1);
205+
Assert.Same(fakeServiceFromRootScope, fakeServiceFromScope2);
206+
// resolved through scope should be different from corresponding scoped instance
207+
Assert.NotSame(fakeServiceFromScope1, scopedFakeServiceFromScope1);
208+
Assert.NotSame(fakeServiceFromScope2, scopedFakeServiceFromScope2);
209+
Assert.NotSame(scopedFakeServiceFromScope1, scopedFakeServiceFromScope2);
196210
}
197211

198212
[Fact]

0 commit comments

Comments
 (0)