diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs index 14c42b7b7f..d543493ce9 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs @@ -12,10 +12,10 @@ public abstract class CachedServiceProviderBase { _serviceProvider = serviceProvider; _cachedServices = new ConcurrentDictionary>(); - _cachedServices.TryAdd(typeof(IServiceProvider), new Lazy(() => this)); + _cachedServices.TryAdd(typeof(IServiceProvider), new Lazy(() => _serviceProvider)); } - public object GetService(Type serviceType) + public virtual object GetService(Type serviceType) { return _cachedServices.GetOrAdd( serviceType, diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/CachedServiceProvider_Tests.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/CachedServiceProvider_Tests.cs index f2bfa2534a..b040bbc71f 100644 --- a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/CachedServiceProvider_Tests.cs +++ b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DependencyInjection/CachedServiceProvider_Tests.cs @@ -1,4 +1,5 @@ -using Microsoft.Extensions.DependencyInjection; +using System; +using Microsoft.Extensions.DependencyInjection; using Shouldly; using Volo.Abp.Modularity; using Volo.Abp.Testing.Utils; @@ -20,6 +21,9 @@ public class CachedServiceProvider_Tests var transientTestService1 = cachedServiceProvider1.GetRequiredService(); var transientTestService2 = cachedServiceProvider2.GetRequiredService(); transientTestService1.ShouldBeSameAs(transientTestService2); + + var cachedServiceProvider3 = cachedServiceProvider1.GetRequiredService().GetRequiredService(); + cachedServiceProvider3.ShouldBeSameAs(cachedServiceProvider1); } using (var application = AbpApplicationFactory.Create()) @@ -49,20 +53,26 @@ public class CachedServiceProvider_Tests { void TestResolvingServices(IServiceScope scope) { - var cachedServiceProvider1 = scope.ServiceProvider.GetRequiredService(); + var transientCachedServiceProvider1 = scope.ServiceProvider.GetRequiredService(); - var transientTestService1_1 = cachedServiceProvider1.GetRequiredService(); - var transientTestService1_2 = cachedServiceProvider1.GetRequiredService(); + var transientTestService1_1 = transientCachedServiceProvider1.GetRequiredService(); + var transientTestService1_2 = transientCachedServiceProvider1.GetRequiredService(); transientTestService1_1.ShouldBeSameAs(transientTestService1_2); - var cachedServiceProvider2 = scope.ServiceProvider.GetRequiredService(); - cachedServiceProvider1.ShouldNotBeSameAs(cachedServiceProvider2); + var transientCachedServiceProvider2 = scope.ServiceProvider.GetRequiredService(); + transientCachedServiceProvider1.ShouldNotBeSameAs(transientCachedServiceProvider2); - var transientTestService2_1 = cachedServiceProvider2.GetRequiredService(); - var transientTestService2_2 = cachedServiceProvider2.GetRequiredService(); + var transientTestService2_1 = transientCachedServiceProvider2.GetRequiredService(); + var transientTestService2_2 = transientCachedServiceProvider2.GetRequiredService(); transientTestService2_1.ShouldBeSameAs(transientTestService2_2); transientTestService1_1.ShouldNotBeSameAs(transientTestService2_1); + + var transientCachedServiceProvider1_1 = transientCachedServiceProvider1.GetRequiredService().GetRequiredService(); + var transientCachedServiceProvider1_2 = transientCachedServiceProvider1.GetRequiredService().GetRequiredService(); + transientCachedServiceProvider1_1.ShouldNotBeSameAs(transientCachedServiceProvider1); + transientCachedServiceProvider1_2.ShouldNotBeSameAs(transientCachedServiceProvider1); + transientCachedServiceProvider1_1.ShouldNotBeSameAs(transientCachedServiceProvider1_2); } using (var application = AbpApplicationFactory.Create())