#12918: CachedServiceProviderBase should return the internal service provider when requested.

pull/12963/head
Halil İbrahim Kalkan 3 years ago
parent 58c75ed8cb
commit 0b0b007d7e

@ -12,10 +12,10 @@ public abstract class CachedServiceProviderBase
{ {
_serviceProvider = serviceProvider; _serviceProvider = serviceProvider;
_cachedServices = new ConcurrentDictionary<Type, Lazy<object>>(); _cachedServices = new ConcurrentDictionary<Type, Lazy<object>>();
_cachedServices.TryAdd(typeof(IServiceProvider), new Lazy<object>(() => this)); _cachedServices.TryAdd(typeof(IServiceProvider), new Lazy<object>(() => _serviceProvider));
} }
public object GetService(Type serviceType) public virtual object GetService(Type serviceType)
{ {
return _cachedServices.GetOrAdd( return _cachedServices.GetOrAdd(
serviceType, serviceType,

@ -1,4 +1,5 @@
using Microsoft.Extensions.DependencyInjection; using System;
using Microsoft.Extensions.DependencyInjection;
using Shouldly; using Shouldly;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Testing.Utils; using Volo.Abp.Testing.Utils;
@ -20,6 +21,9 @@ public class CachedServiceProvider_Tests
var transientTestService1 = cachedServiceProvider1.GetRequiredService<TransientTestService>(); var transientTestService1 = cachedServiceProvider1.GetRequiredService<TransientTestService>();
var transientTestService2 = cachedServiceProvider2.GetRequiredService<TransientTestService>(); var transientTestService2 = cachedServiceProvider2.GetRequiredService<TransientTestService>();
transientTestService1.ShouldBeSameAs(transientTestService2); transientTestService1.ShouldBeSameAs(transientTestService2);
var cachedServiceProvider3 = cachedServiceProvider1.GetRequiredService<IServiceProvider>().GetRequiredService<ICachedServiceProvider>();
cachedServiceProvider3.ShouldBeSameAs(cachedServiceProvider1);
} }
using (var application = AbpApplicationFactory.Create<TestModule>()) using (var application = AbpApplicationFactory.Create<TestModule>())
@ -49,20 +53,26 @@ public class CachedServiceProvider_Tests
{ {
void TestResolvingServices(IServiceScope scope) void TestResolvingServices(IServiceScope scope)
{ {
var cachedServiceProvider1 = scope.ServiceProvider.GetRequiredService<ITransientCachedServiceProvider>(); var transientCachedServiceProvider1 = scope.ServiceProvider.GetRequiredService<ITransientCachedServiceProvider>();
var transientTestService1_1 = cachedServiceProvider1.GetRequiredService<TransientTestService>(); var transientTestService1_1 = transientCachedServiceProvider1.GetRequiredService<TransientTestService>();
var transientTestService1_2 = cachedServiceProvider1.GetRequiredService<TransientTestService>(); var transientTestService1_2 = transientCachedServiceProvider1.GetRequiredService<TransientTestService>();
transientTestService1_1.ShouldBeSameAs(transientTestService1_2); transientTestService1_1.ShouldBeSameAs(transientTestService1_2);
var cachedServiceProvider2 = scope.ServiceProvider.GetRequiredService<ITransientCachedServiceProvider>(); var transientCachedServiceProvider2 = scope.ServiceProvider.GetRequiredService<ITransientCachedServiceProvider>();
cachedServiceProvider1.ShouldNotBeSameAs(cachedServiceProvider2); transientCachedServiceProvider1.ShouldNotBeSameAs(transientCachedServiceProvider2);
var transientTestService2_1 = cachedServiceProvider2.GetRequiredService<TransientTestService>(); var transientTestService2_1 = transientCachedServiceProvider2.GetRequiredService<TransientTestService>();
var transientTestService2_2 = cachedServiceProvider2.GetRequiredService<TransientTestService>(); var transientTestService2_2 = transientCachedServiceProvider2.GetRequiredService<TransientTestService>();
transientTestService2_1.ShouldBeSameAs(transientTestService2_2); transientTestService2_1.ShouldBeSameAs(transientTestService2_2);
transientTestService1_1.ShouldNotBeSameAs(transientTestService2_1); transientTestService1_1.ShouldNotBeSameAs(transientTestService2_1);
var transientCachedServiceProvider1_1 = transientCachedServiceProvider1.GetRequiredService<IServiceProvider>().GetRequiredService<ITransientCachedServiceProvider>();
var transientCachedServiceProvider1_2 = transientCachedServiceProvider1.GetRequiredService<IServiceProvider>().GetRequiredService<ITransientCachedServiceProvider>();
transientCachedServiceProvider1_1.ShouldNotBeSameAs(transientCachedServiceProvider1);
transientCachedServiceProvider1_2.ShouldNotBeSameAs(transientCachedServiceProvider1);
transientCachedServiceProvider1_1.ShouldNotBeSameAs(transientCachedServiceProvider1_2);
} }
using (var application = AbpApplicationFactory.Create<TestModule>()) using (var application = AbpApplicationFactory.Create<TestModule>())

Loading…
Cancel
Save