From 106a398d0a05ec2bdfe544d5758d55cce399e4cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 1 Jan 2021 17:36:57 +0300 Subject: [PATCH] Introduce IClientScopeServiceProviderAccessor to access the main scope for the current client. --- .../AbpWebAssemblyHostBuilderExtensions.cs | 13 +++++--- .../AbpBlazorClientHttpMessageHandler.cs | 8 ++--- ...emblyClientScopeServiceProviderAccessor.cs | 12 +++++++ ...ntextClientScopeServiceProviderAccessor.cs | 33 +++++++++++++++++++ .../BlazoriseUiPageProgressService.cs | 5 +-- .../IClientScopeServiceProviderAccessor.cs | 9 +++++ 6 files changed, 68 insertions(+), 12 deletions(-) create mode 100644 framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/DependencyInjection/WebAssemblyClientScopeServiceProviderAccessor.cs create mode 100644 framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/DependencyInjection/HttpContextClientScopeServiceProviderAccessor.cs create mode 100644 framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IClientScopeServiceProviderAccessor.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/AspNetCore/Components/WebAssembly/Hosting/AbpWebAssemblyHostBuilderExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/AspNetCore/Components/WebAssembly/Hosting/AbpWebAssemblyHostBuilderExtensions.cs index 7cba7ce9b3..9e1752ffda 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/AspNetCore/Components/WebAssembly/Hosting/AbpWebAssemblyHostBuilderExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/AspNetCore/Components/WebAssembly/Hosting/AbpWebAssemblyHostBuilderExtensions.cs @@ -1,6 +1,5 @@ using System; using System.Globalization; -using System.Reflection; using System.Runtime.CompilerServices; using System.Threading.Tasks; using JetBrains.Annotations; @@ -8,7 +7,9 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Volo.Abp; using Volo.Abp.AspNetCore.Components.WebAssembly; +using Volo.Abp.AspNetCore.Components.WebAssembly.DependencyInjection; using Volo.Abp.AspNetCore.Mvc.Client; +using Volo.Abp.DependencyInjection; using Volo.Abp.Modularity; namespace Microsoft.AspNetCore.Components.WebAssembly.Hosting @@ -39,13 +40,17 @@ namespace Microsoft.AspNetCore.Components.WebAssembly.Hosting return application; } - public async static Task InitializeAsync( + public static async Task InitializeAsync( [NotNull] this IAbpApplicationWithExternalServiceProvider application, [NotNull] IServiceProvider serviceProvider) { Check.NotNull(application, nameof(application)); Check.NotNull(serviceProvider, nameof(serviceProvider)); + var serviceProviderAccessor = (WebAssemblyClientScopeServiceProviderAccessor) + serviceProvider.GetRequiredService(); + serviceProviderAccessor.ServiceProvider = serviceProvider; + application.Initialize(serviceProvider); using (var scope = serviceProvider.CreateScope()) @@ -55,7 +60,7 @@ namespace Microsoft.AspNetCore.Components.WebAssembly.Hosting } } - private async static Task InitializeModulesAsync(IServiceProvider serviceProvider) + private static async Task InitializeModulesAsync(IServiceProvider serviceProvider) { foreach (var service in serviceProvider.GetServices()) { @@ -63,7 +68,7 @@ namespace Microsoft.AspNetCore.Components.WebAssembly.Hosting } } - private async static Task SetCurrentLanguageAsync(IServiceScope scope) + private static async Task SetCurrentLanguageAsync(IServiceScope scope) { var configurationClient = scope.ServiceProvider.GetRequiredService(); var utilsService = scope.ServiceProvider.GetRequiredService(); diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpBlazorClientHttpMessageHandler.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpBlazorClientHttpMessageHandler.cs index 310e9cc8a8..fcdf065943 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpBlazorClientHttpMessageHandler.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpBlazorClientHttpMessageHandler.cs @@ -4,7 +4,7 @@ using System.Net.Http.Headers; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Components; -using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; using Microsoft.JSInterop; using Volo.Abp.AspNetCore.Components.Progression; using Volo.Abp.DependencyInjection; @@ -29,15 +29,15 @@ namespace Volo.Abp.AspNetCore.Components.WebAssembly IJSRuntime jsRuntime, ICookieService cookieService, NavigationManager navigationManager, - IUiPageProgressService uiPageProgressService) + IClientScopeServiceProviderAccessor clientScopeServiceProviderAccessor) { _jsRuntime = jsRuntime; _cookieService = cookieService; _navigationManager = navigationManager; - _uiPageProgressService = uiPageProgressService; + _uiPageProgressService = clientScopeServiceProviderAccessor.ServiceProvider.GetRequiredService(); } - protected async override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) + protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { try { diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/DependencyInjection/WebAssemblyClientScopeServiceProviderAccessor.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/DependencyInjection/WebAssemblyClientScopeServiceProviderAccessor.cs new file mode 100644 index 0000000000..74b16ec951 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/DependencyInjection/WebAssemblyClientScopeServiceProviderAccessor.cs @@ -0,0 +1,12 @@ +using System; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.AspNetCore.Components.WebAssembly.DependencyInjection +{ + public class WebAssemblyClientScopeServiceProviderAccessor : + IClientScopeServiceProviderAccessor, + ISingletonDependency + { + public IServiceProvider ServiceProvider { get; set; } + } +} diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/DependencyInjection/HttpContextClientScopeServiceProviderAccessor.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/DependencyInjection/HttpContextClientScopeServiceProviderAccessor.cs new file mode 100644 index 0000000000..943c11ebc3 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/DependencyInjection/HttpContextClientScopeServiceProviderAccessor.cs @@ -0,0 +1,33 @@ +using System; +using Microsoft.AspNetCore.Http; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.AspNetCore.DependencyInjection +{ + public class HttpContextClientScopeServiceProviderAccessor : + IClientScopeServiceProviderAccessor, + ISingletonDependency + { + public IServiceProvider ServiceProvider + { + get + { + var httpContext = _httpContextAccessor.HttpContext; + if (httpContext == null) + { + throw new AbpException("HttpContextClientScopeServiceProviderAccessor should only be used in a web request scope!"); + } + + return httpContext.RequestServices; + } + } + + private readonly IHttpContextAccessor _httpContextAccessor; + + public HttpContextClientScopeServiceProviderAccessor( + IHttpContextAccessor httpContextAccessor) + { + _httpContextAccessor = httpContextAccessor; + } + } +} diff --git a/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiPageProgressService.cs b/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiPageProgressService.cs index 92e611df58..5285669c00 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiPageProgressService.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiPageProgressService.cs @@ -1,16 +1,13 @@ using System; using System.Threading.Tasks; using Volo.Abp.AspNetCore.Components.Progression; -using Volo.Abp.AspNetCore.Components.WebAssembly; using Volo.Abp.DependencyInjection; namespace Volo.Abp.BlazoriseUI { [Dependency(ReplaceServices = true)] public class BlazoriseUiPageProgressService : IUiPageProgressService, - // WARNING: this is made Singleton because there was an issue with ABP internal DI. - // TODO: make it Scoped once the issue is solved. - ISingletonDependency + IScopedDependency { /// /// An event raised after the notification is received. diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IClientScopeServiceProviderAccessor.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IClientScopeServiceProviderAccessor.cs new file mode 100644 index 0000000000..7c1d1ed08d --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IClientScopeServiceProviderAccessor.cs @@ -0,0 +1,9 @@ +using System; + +namespace Volo.Abp.DependencyInjection +{ + public interface IClientScopeServiceProviderAccessor + { + IServiceProvider ServiceProvider { get; } + } +}