From e2feaef57d0ecdf77c8992e88c3ea17704aad6c8 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 4 Jan 2021 10:33:51 +0800 Subject: [PATCH] Use IServiceScopeFactory in some interceptors. --- .../Volo/Abp/Auditing/AuditingInterceptor.cs | 45 ++++++++++--------- .../Authorization/AuthorizationInterceptor.cs | 2 +- .../Volo/Abp/Features/FeatureInterceptor.cs | 19 ++++---- .../Volo/Abp/Uow/UnitOfWorkInterceptor.cs | 40 +++++++++-------- 4 files changed, 58 insertions(+), 48 deletions(-) diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingInterceptor.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingInterceptor.cs index 681dc0eb0d..9142db5617 100644 --- a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingInterceptor.cs +++ b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingInterceptor.cs @@ -10,11 +10,11 @@ namespace Volo.Abp.Auditing { public class AuditingInterceptor : AbpInterceptor, ITransientDependency { - private readonly IServiceProvider _serviceProvider; + private readonly IServiceScopeFactory _serviceScopeFactory; - public AuditingInterceptor(IServiceProvider serviceProvider) + public AuditingInterceptor(IServiceScopeFactory serviceScopeFactory) { - _serviceProvider = serviceProvider; + _serviceScopeFactory = serviceScopeFactory; } public override async Task InterceptAsync(IAbpMethodInvocation invocation) @@ -57,28 +57,31 @@ namespace Volo.Abp.Auditing return false; } - var auditingManager = _serviceProvider.GetRequiredService(); - var auditLogScope = auditingManager.Current; - if (auditLogScope == null) + using (var scope = _serviceScopeFactory.CreateScope()) { - return false; - } + var auditingManager = scope.ServiceProvider.GetRequiredService(); + var auditLogScope = auditingManager.Current; + if (auditLogScope == null) + { + return false; + } - var auditingHelper = _serviceProvider.GetRequiredService(); - if (!auditingHelper.ShouldSaveAudit(invocation.Method)) - { - return false; - } + var auditingHelper = scope.ServiceProvider.GetRequiredService(); + if (!auditingHelper.ShouldSaveAudit(invocation.Method)) + { + return false; + } - auditLog = auditLogScope.Log; - auditLogAction = auditingHelper.CreateAuditLogAction( - auditLog, - invocation.TargetObject.GetType(), - invocation.Method, - invocation.Arguments - ); + auditLog = auditLogScope.Log; + auditLogAction = auditingHelper.CreateAuditLogAction( + auditLog, + invocation.TargetObject.GetType(), + invocation.Method, + invocation.Arguments + ); - return true; + return true; + } } } } diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AuthorizationInterceptor.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AuthorizationInterceptor.cs index 82f4adeabe..44466884dd 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AuthorizationInterceptor.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AuthorizationInterceptor.cs @@ -13,7 +13,7 @@ namespace Volo.Abp.Authorization _methodInvocationAuthorizationService = methodInvocationAuthorizationService; } - public async override Task InterceptAsync(IAbpMethodInvocation invocation) + public override async Task InterceptAsync(IAbpMethodInvocation invocation) { await AuthorizeAsync(invocation); await invocation.ProceedAsync(); diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureInterceptor.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureInterceptor.cs index aff34d358f..8c0936bede 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureInterceptor.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureInterceptor.cs @@ -9,11 +9,11 @@ namespace Volo.Abp.Features { public class FeatureInterceptor : AbpInterceptor, ITransientDependency { - private readonly IServiceProvider _serviceProvider; + private readonly IServiceScopeFactory _serviceScopeFactory; - public FeatureInterceptor(IServiceProvider serviceProvider) + public FeatureInterceptor(IServiceScopeFactory serviceScopeFactory) { - _serviceProvider = serviceProvider; + _serviceScopeFactory = serviceScopeFactory; } public override async Task InterceptAsync(IAbpMethodInvocation invocation) @@ -30,11 +30,14 @@ namespace Volo.Abp.Features protected virtual async Task CheckFeaturesAsync(IAbpMethodInvocation invocation) { - await _serviceProvider.GetRequiredService().CheckAsync( - new MethodInvocationFeatureCheckerContext( - invocation.Method - ) - ); + using (var scope = _serviceScopeFactory.CreateScope()) + { + await scope.ServiceProvider.GetRequiredService().CheckAsync( + new MethodInvocationFeatureCheckerContext( + invocation.Method + ) + ); + } } } } diff --git a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWorkInterceptor.cs b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWorkInterceptor.cs index 028fa9a15a..3d8654adb0 100644 --- a/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWorkInterceptor.cs +++ b/framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWorkInterceptor.cs @@ -10,11 +10,11 @@ namespace Volo.Abp.Uow { public class UnitOfWorkInterceptor : AbpInterceptor, ITransientDependency { - private readonly IServiceProvider _serviceProvider; + private readonly IServiceScopeFactory _serviceScopeFactory; - public UnitOfWorkInterceptor(IServiceProvider serviceProvider) + public UnitOfWorkInterceptor(IServiceScopeFactory serviceScopeFactory) { - _serviceProvider = serviceProvider; + _serviceScopeFactory = serviceScopeFactory; } public override async Task InterceptAsync(IAbpMethodInvocation invocation) @@ -25,24 +25,28 @@ namespace Volo.Abp.Uow return; } - var options = CreateOptions(invocation, unitOfWorkAttribute); - var unitOfWorkManager = _serviceProvider.GetRequiredService(); - - //Trying to begin a reserved UOW by AbpUnitOfWorkMiddleware - if (unitOfWorkManager.TryBeginReserved(UnitOfWork.UnitOfWorkReservationName, options)) + using (var scope = _serviceScopeFactory.CreateScope()) { - await invocation.ProceedAsync(); - return; - } + var options = CreateOptions(scope.ServiceProvider, invocation, unitOfWorkAttribute); - using (var uow = unitOfWorkManager.Begin(options)) - { - await invocation.ProceedAsync(); - await uow.CompleteAsync(); + var unitOfWorkManager = scope.ServiceProvider.GetRequiredService(); + + //Trying to begin a reserved UOW by AbpUnitOfWorkMiddleware + if (unitOfWorkManager.TryBeginReserved(UnitOfWork.UnitOfWorkReservationName, options)) + { + await invocation.ProceedAsync(); + return; + } + + using (var uow = unitOfWorkManager.Begin(options)) + { + await invocation.ProceedAsync(); + await uow.CompleteAsync(); + } } } - private AbpUnitOfWorkOptions CreateOptions(IAbpMethodInvocation invocation, [CanBeNull] UnitOfWorkAttribute unitOfWorkAttribute) + private AbpUnitOfWorkOptions CreateOptions(IServiceProvider serviceProvider, IAbpMethodInvocation invocation, [CanBeNull] UnitOfWorkAttribute unitOfWorkAttribute) { var options = new AbpUnitOfWorkOptions(); @@ -50,9 +54,9 @@ namespace Volo.Abp.Uow if (unitOfWorkAttribute?.IsTransactional == null) { - var defaultOptions = _serviceProvider.GetRequiredService>().Value; + var defaultOptions = serviceProvider.GetRequiredService>().Value; options.IsTransactional = defaultOptions.CalculateIsTransactional( - autoValue: _serviceProvider.GetRequiredService().IsTransactional + autoValue: serviceProvider.GetRequiredService().IsTransactional ?? !invocation.Method.Name.StartsWith("Get", StringComparison.InvariantCultureIgnoreCase) ); }