@@ -324,6 +324,114 @@ public void ResolveKeyedServiceTransientTypeWithAnyKey()
324
324
Assert . NotSame ( first , second ) ;
325
325
}
326
326
327
+ [ Fact ]
328
+ public void ResolveKeyedSingletonFromInjectedServiceProvider ( )
329
+ {
330
+ var serviceCollection = new ServiceCollection ( ) ;
331
+ serviceCollection . AddKeyedSingleton < IService , Service > ( "key" ) ;
332
+ serviceCollection . AddSingleton < ServiceProviderAccessor > ( ) ;
333
+
334
+ var provider = CreateServiceProvider ( serviceCollection ) ;
335
+ var accessor = provider . GetRequiredService < ServiceProviderAccessor > ( ) ;
336
+
337
+ Assert . Null ( accessor . ServiceProvider . GetService < IService > ( ) ) ;
338
+
339
+ var service1 = accessor . ServiceProvider . GetKeyedService < IService > ( "key" ) ;
340
+ var service2 = accessor . ServiceProvider . GetKeyedService < IService > ( "key" ) ;
341
+
342
+ Assert . Same ( service1 , service2 ) ;
343
+ }
344
+
345
+ [ Fact ]
346
+ public void ResolveKeyedTransientFromInjectedServiceProvider ( )
347
+ {
348
+ var serviceCollection = new ServiceCollection ( ) ;
349
+ serviceCollection . AddKeyedTransient < IService , Service > ( "key" ) ;
350
+ serviceCollection . AddSingleton < ServiceProviderAccessor > ( ) ;
351
+
352
+ var provider = CreateServiceProvider ( serviceCollection ) ;
353
+ var accessor = provider . GetRequiredService < ServiceProviderAccessor > ( ) ;
354
+
355
+ Assert . Null ( accessor . ServiceProvider . GetService < IService > ( ) ) ;
356
+
357
+ var service1 = accessor . ServiceProvider . GetKeyedService < IService > ( "key" ) ;
358
+ var service2 = accessor . ServiceProvider . GetKeyedService < IService > ( "key" ) ;
359
+
360
+ Assert . NotSame ( service1 , service2 ) ;
361
+ }
362
+
363
+ [ Fact ]
364
+ public void ResolveKeyedSingletonFromScopeServiceProvider ( )
365
+ {
366
+ var serviceCollection = new ServiceCollection ( ) ;
367
+ serviceCollection . AddKeyedSingleton < IService , Service > ( "key" ) ;
368
+
369
+ var provider = CreateServiceProvider ( serviceCollection ) ;
370
+ var scopeA = provider . GetRequiredService < IServiceScopeFactory > ( ) . CreateScope ( ) ;
371
+ var scopeB = provider . GetRequiredService < IServiceScopeFactory > ( ) . CreateScope ( ) ;
372
+
373
+ Assert . Null ( scopeA . ServiceProvider . GetService < IService > ( ) ) ;
374
+ Assert . Null ( scopeB . ServiceProvider . GetService < IService > ( ) ) ;
375
+
376
+ var serviceA1 = scopeA . ServiceProvider . GetKeyedService < IService > ( "key" ) ;
377
+ var serviceA2 = scopeA . ServiceProvider . GetKeyedService < IService > ( "key" ) ;
378
+
379
+ var serviceB1 = scopeB . ServiceProvider . GetKeyedService < IService > ( "key" ) ;
380
+ var serviceB2 = scopeB . ServiceProvider . GetKeyedService < IService > ( "key" ) ;
381
+
382
+ Assert . Same ( serviceA1 , serviceA2 ) ;
383
+ Assert . Same ( serviceB1 , serviceB2 ) ;
384
+ Assert . Same ( serviceA1 , serviceB1 ) ;
385
+ }
386
+
387
+ [ Fact ]
388
+ public void ResolveKeyedScopedFromScopeServiceProvider ( )
389
+ {
390
+ var serviceCollection = new ServiceCollection ( ) ;
391
+ serviceCollection . AddKeyedScoped < IService , Service > ( "key" ) ;
392
+
393
+ var provider = CreateServiceProvider ( serviceCollection ) ;
394
+ var scopeA = provider . GetRequiredService < IServiceScopeFactory > ( ) . CreateScope ( ) ;
395
+ var scopeB = provider . GetRequiredService < IServiceScopeFactory > ( ) . CreateScope ( ) ;
396
+
397
+ Assert . Null ( scopeA . ServiceProvider . GetService < IService > ( ) ) ;
398
+ Assert . Null ( scopeB . ServiceProvider . GetService < IService > ( ) ) ;
399
+
400
+ var serviceA1 = scopeA . ServiceProvider . GetKeyedService < IService > ( "key" ) ;
401
+ var serviceA2 = scopeA . ServiceProvider . GetKeyedService < IService > ( "key" ) ;
402
+
403
+ var serviceB1 = scopeB . ServiceProvider . GetKeyedService < IService > ( "key" ) ;
404
+ var serviceB2 = scopeB . ServiceProvider . GetKeyedService < IService > ( "key" ) ;
405
+
406
+ Assert . Same ( serviceA1 , serviceA2 ) ;
407
+ Assert . Same ( serviceB1 , serviceB2 ) ;
408
+ Assert . NotSame ( serviceA1 , serviceB1 ) ;
409
+ }
410
+
411
+ [ Fact ]
412
+ public void ResolveKeyedTransientFromScopeServiceProvider ( )
413
+ {
414
+ var serviceCollection = new ServiceCollection ( ) ;
415
+ serviceCollection . AddKeyedTransient < IService , Service > ( "key" ) ;
416
+
417
+ var provider = CreateServiceProvider ( serviceCollection ) ;
418
+ var scopeA = provider . GetRequiredService < IServiceScopeFactory > ( ) . CreateScope ( ) ;
419
+ var scopeB = provider . GetRequiredService < IServiceScopeFactory > ( ) . CreateScope ( ) ;
420
+
421
+ Assert . Null ( scopeA . ServiceProvider . GetService < IService > ( ) ) ;
422
+ Assert . Null ( scopeB . ServiceProvider . GetService < IService > ( ) ) ;
423
+
424
+ var serviceA1 = scopeA . ServiceProvider . GetKeyedService < IService > ( "key" ) ;
425
+ var serviceA2 = scopeA . ServiceProvider . GetKeyedService < IService > ( "key" ) ;
426
+
427
+ var serviceB1 = scopeB . ServiceProvider . GetKeyedService < IService > ( "key" ) ;
428
+ var serviceB2 = scopeB . ServiceProvider . GetKeyedService < IService > ( "key" ) ;
429
+
430
+ Assert . NotSame ( serviceA1 , serviceA2 ) ;
431
+ Assert . NotSame ( serviceB1 , serviceB2 ) ;
432
+ Assert . NotSame ( serviceA1 , serviceB1 ) ;
433
+ }
434
+
327
435
internal interface IService { }
328
436
329
437
internal class Service : IService
@@ -358,5 +466,15 @@ internal class ServiceWithIntKey : IService
358
466
359
467
public ServiceWithIntKey ( [ ServiceKey ] int id ) => _id = id ;
360
468
}
469
+
470
+ internal class ServiceProviderAccessor
471
+ {
472
+ public ServiceProviderAccessor ( IServiceProvider serviceProvider )
473
+ {
474
+ ServiceProvider = serviceProvider ;
475
+ }
476
+
477
+ public IServiceProvider ServiceProvider { get ; }
478
+ }
361
479
}
362
480
}
0 commit comments