Browse Source

Introduce IClientScopeServiceProviderAccessor to access the main scope for the current client.

pull/6853/head
Halil İbrahim Kalkan 6 years ago
parent
commit
106a398d0a
  1. 13
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/AspNetCore/Components/WebAssembly/Hosting/AbpWebAssemblyHostBuilderExtensions.cs
  2. 8
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpBlazorClientHttpMessageHandler.cs
  3. 12
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/DependencyInjection/WebAssemblyClientScopeServiceProviderAccessor.cs
  4. 33
      framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/DependencyInjection/HttpContextClientScopeServiceProviderAccessor.cs
  5. 5
      framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiPageProgressService.cs
  6. 9
      framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IClientScopeServiceProviderAccessor.cs

13
framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/AspNetCore/Components/WebAssembly/Hosting/AbpWebAssemblyHostBuilderExtensions.cs

@ -1,6 +1,5 @@
using System; using System;
using System.Globalization; using System.Globalization;
using System.Reflection;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Threading.Tasks; using System.Threading.Tasks;
using JetBrains.Annotations; using JetBrains.Annotations;
@ -8,7 +7,9 @@ using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.AspNetCore.Components.WebAssembly; using Volo.Abp.AspNetCore.Components.WebAssembly;
using Volo.Abp.AspNetCore.Components.WebAssembly.DependencyInjection;
using Volo.Abp.AspNetCore.Mvc.Client; using Volo.Abp.AspNetCore.Mvc.Client;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
namespace Microsoft.AspNetCore.Components.WebAssembly.Hosting namespace Microsoft.AspNetCore.Components.WebAssembly.Hosting
@ -39,13 +40,17 @@ namespace Microsoft.AspNetCore.Components.WebAssembly.Hosting
return application; return application;
} }
public async static Task InitializeAsync( public static async Task InitializeAsync(
[NotNull] this IAbpApplicationWithExternalServiceProvider application, [NotNull] this IAbpApplicationWithExternalServiceProvider application,
[NotNull] IServiceProvider serviceProvider) [NotNull] IServiceProvider serviceProvider)
{ {
Check.NotNull(application, nameof(application)); Check.NotNull(application, nameof(application));
Check.NotNull(serviceProvider, nameof(serviceProvider)); Check.NotNull(serviceProvider, nameof(serviceProvider));
var serviceProviderAccessor = (WebAssemblyClientScopeServiceProviderAccessor)
serviceProvider.GetRequiredService<IClientScopeServiceProviderAccessor>();
serviceProviderAccessor.ServiceProvider = serviceProvider;
application.Initialize(serviceProvider); application.Initialize(serviceProvider);
using (var scope = serviceProvider.CreateScope()) 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<IAsyncInitialize>()) foreach (var service in serviceProvider.GetServices<IAsyncInitialize>())
{ {
@ -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<ICachedApplicationConfigurationClient>(); var configurationClient = scope.ServiceProvider.GetRequiredService<ICachedApplicationConfigurationClient>();
var utilsService = scope.ServiceProvider.GetRequiredService<IAbpUtilsService>(); var utilsService = scope.ServiceProvider.GetRequiredService<IAbpUtilsService>();

8
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;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection;
using Microsoft.JSInterop; using Microsoft.JSInterop;
using Volo.Abp.AspNetCore.Components.Progression; using Volo.Abp.AspNetCore.Components.Progression;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
@ -29,15 +29,15 @@ namespace Volo.Abp.AspNetCore.Components.WebAssembly
IJSRuntime jsRuntime, IJSRuntime jsRuntime,
ICookieService cookieService, ICookieService cookieService,
NavigationManager navigationManager, NavigationManager navigationManager,
IUiPageProgressService uiPageProgressService) IClientScopeServiceProviderAccessor clientScopeServiceProviderAccessor)
{ {
_jsRuntime = jsRuntime; _jsRuntime = jsRuntime;
_cookieService = cookieService; _cookieService = cookieService;
_navigationManager = navigationManager; _navigationManager = navigationManager;
_uiPageProgressService = uiPageProgressService; _uiPageProgressService = clientScopeServiceProviderAccessor.ServiceProvider.GetRequiredService<IUiPageProgressService>();
} }
protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{ {
try try
{ {

12
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; }
}
}

33
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;
}
}
}

5
framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiPageProgressService.cs

@ -1,16 +1,13 @@
using System; using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.AspNetCore.Components.Progression; using Volo.Abp.AspNetCore.Components.Progression;
using Volo.Abp.AspNetCore.Components.WebAssembly;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
namespace Volo.Abp.BlazoriseUI namespace Volo.Abp.BlazoriseUI
{ {
[Dependency(ReplaceServices = true)] [Dependency(ReplaceServices = true)]
public class BlazoriseUiPageProgressService : IUiPageProgressService, public class BlazoriseUiPageProgressService : IUiPageProgressService,
// WARNING: this is made Singleton because there was an issue with ABP internal DI. IScopedDependency
// TODO: make it Scoped once the issue is solved.
ISingletonDependency
{ {
/// <summary> /// <summary>
/// An event raised after the notification is received. /// An event raised after the notification is received.

9
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; }
}
}
Loading…
Cancel
Save