From 4014a60dfb49e05e99e8679838e6b7ee1e4575eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 11 Aug 2022 17:18:59 +0300 Subject: [PATCH] Introduce IRootServiceProviderAccessor --- .../IRootServiceProviderAccessor.cs | 12 ++++++++++++ .../RootServiceProviderAccessor.cs | 14 ++++++++++++++ .../Volo/Abp/AbpApplication_Initialize_Tests.cs | 16 ++++++++++++++++ 3 files changed, 42 insertions(+) create mode 100644 framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IRootServiceProviderAccessor.cs create mode 100644 framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/RootServiceProviderAccessor.cs diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IRootServiceProviderAccessor.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IRootServiceProviderAccessor.cs new file mode 100644 index 0000000000..cb22e45287 --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IRootServiceProviderAccessor.cs @@ -0,0 +1,12 @@ +namespace Volo.Abp.DependencyInjection; + +/// +/// Gets the root service provider of the application. +/// Be careful to use the root service provider since there is no way +/// to release/dispose objects resolved from the root service provider. +/// So, always create a new scope if you need to resolve any service. +/// +public interface IRootServiceProviderAccessor : IServiceProviderAccessor +{ + +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/RootServiceProviderAccessor.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/RootServiceProviderAccessor.cs new file mode 100644 index 0000000000..1f0639be12 --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/RootServiceProviderAccessor.cs @@ -0,0 +1,14 @@ +using System; + +namespace Volo.Abp.DependencyInjection; + +[ExposeServices(typeof(IRootServiceProviderAccessor))] +public class RootServiceProviderAccessor : IRootServiceProviderAccessor, ISingletonDependency +{ + public IServiceProvider ServiceProvider { get; } + + public RootServiceProviderAccessor(IObjectAccessor objectAccessor) + { + ServiceProvider = objectAccessor.Value; + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/AbpApplication_Initialize_Tests.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/AbpApplication_Initialize_Tests.cs index 4ce2bf1d36..f51cb8d573 100644 --- a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/AbpApplication_Initialize_Tests.cs +++ b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/AbpApplication_Initialize_Tests.cs @@ -1,6 +1,7 @@ using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Shouldly; +using Volo.Abp.DependencyInjection; using Volo.Abp.Modularity; using Volo.Abp.Modularity.PlugIns; using Xunit; @@ -157,4 +158,19 @@ public class AbpApplication_Initialize_Tests application.Services.GetApplicationName().ShouldBe(applicationName); } } + + [Fact] + public async Task Should_Resolve_Root_Service_Provider() + { + using (var application = await AbpApplicationFactory.CreateAsync()) + { + await application.InitializeAsync(); + + application + .ServiceProvider + .GetRequiredService() + .ServiceProvider + .ShouldBeSameAs(application.ServiceProvider); + } + } }