Merge pull request #9046 from abpframework/maliming/patch-blazor

Use AsyncLocal to store static checker.
pull/9072/head
liangshiwei 4 years ago committed by GitHub
commit caf1de5090
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -36,16 +36,17 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars
using (var scope = ServiceProvider.CreateScope())
{
RequirePermissionsSimpleBatchStateChecker<ToolbarItem>.Instance.ClearCheckModels();
using (RequirePermissionsSimpleBatchStateChecker<ToolbarItem>.Use(new RequirePermissionsSimpleBatchStateChecker<ToolbarItem>()))
{
var context = new ToolbarConfigurationContext(ThemeManager.CurrentTheme, toolbar, scope.ServiceProvider);
var context = new ToolbarConfigurationContext(ThemeManager.CurrentTheme, toolbar, scope.ServiceProvider);
foreach (var contributor in Options.Contributors)
{
await contributor.ConfigureToolbarAsync(context);
}
foreach (var contributor in Options.Contributors)
{
await contributor.ConfigureToolbarAsync(context);
await CheckPermissionsAsync(scope.ServiceProvider, toolbar);
}
await CheckPermissionsAsync(scope.ServiceProvider, toolbar);
}
return toolbar;

@ -43,8 +43,8 @@ namespace Volo.Abp.Authorization.Permissions
if (batchCheck)
{
RequirePermissionsSimpleBatchStateChecker<TState>.Instance.AddCheckModels(new RequirePermissionsSimpleBatchStateCheckerModel<TState>(state, permissions, requiresAll));
state.StateCheckers.Add(RequirePermissionsSimpleBatchStateChecker<TState>.Instance);
RequirePermissionsSimpleBatchStateChecker<TState>.Current.AddCheckModels(new RequirePermissionsSimpleBatchStateCheckerModel<TState>(state, permissions, requiresAll));
state.StateCheckers.Add(RequirePermissionsSimpleBatchStateChecker<TState>.Current);
}
else
{

@ -1,5 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.SimpleStateChecking;
@ -9,10 +11,16 @@ namespace Volo.Abp.Authorization.Permissions
public class RequirePermissionsSimpleBatchStateChecker<TState> : SimpleBatchStateCheckerBase<TState>
where TState : IHasSimpleStateCheckers<TState>
{
public static readonly RequirePermissionsSimpleBatchStateChecker<TState> Instance = new RequirePermissionsSimpleBatchStateChecker<TState>();
public static RequirePermissionsSimpleBatchStateChecker<TState> Current => _current.Value;
private static readonly AsyncLocal<RequirePermissionsSimpleBatchStateChecker<TState>> _current = new AsyncLocal<RequirePermissionsSimpleBatchStateChecker<TState>>();
private readonly List<RequirePermissionsSimpleBatchStateCheckerModel<TState>> _models;
static RequirePermissionsSimpleBatchStateChecker()
{
_current.Value = new RequirePermissionsSimpleBatchStateChecker<TState>();
}
public RequirePermissionsSimpleBatchStateChecker()
{
_models = new List<RequirePermissionsSimpleBatchStateCheckerModel<TState>>();
@ -26,9 +34,11 @@ namespace Volo.Abp.Authorization.Permissions
return this;
}
public void ClearCheckModels()
public static IDisposable Use(RequirePermissionsSimpleBatchStateChecker<TState> checker)
{
_models.Clear();
var previousValue = Current;
_current.Value = checker;
return new DisposeAction(() => _current.Value = previousValue);
}
public override async Task<SimpleStateCheckerResult<TState>> IsEnabledAsync(SimpleBatchStateCheckerContext<TState> context)

@ -14,7 +14,6 @@ namespace Volo.Abp.UI.Navigation
protected AbpNavigationOptions Options { get; }
protected IHybridServiceScopeFactory ServiceScopeFactory { get; }
protected ISimpleStateCheckerManager<ApplicationMenuItem> SimpleStateCheckerManager { get; }
public MenuManager(
IOptions<AbpNavigationOptions> options,
IHybridServiceScopeFactory serviceScopeFactory,
@ -31,16 +30,17 @@ namespace Volo.Abp.UI.Navigation
using (var scope = ServiceScopeFactory.CreateScope())
{
RequirePermissionsSimpleBatchStateChecker<ApplicationMenuItem>.Instance.ClearCheckModels();
using (RequirePermissionsSimpleBatchStateChecker<ApplicationMenuItem>.Use(new RequirePermissionsSimpleBatchStateChecker<ApplicationMenuItem>()))
{
var context = new MenuConfigurationContext(menu, scope.ServiceProvider);
var context = new MenuConfigurationContext(menu, scope.ServiceProvider);
foreach (var contributor in Options.MenuContributors)
{
await contributor.ConfigureMenuAsync(context);
}
foreach (var contributor in Options.MenuContributors)
{
await contributor.ConfigureMenuAsync(context);
await CheckPermissionsAsync(scope.ServiceProvider, menu);
}
await CheckPermissionsAsync(scope.ServiceProvider, menu);
}
NormalizeMenu(menu);

@ -16,6 +16,25 @@ namespace Volo.Abp.Authorization
_simpleStateCheckerManager = GetRequiredService<ISimpleStateCheckerManager<MyStateEntity>>();
}
[Fact]
public void Switch_Current_Checker_Test()
{
var checker = RequirePermissionsSimpleBatchStateChecker<MyStateEntity2>.Current;
checker.ShouldNotBeNull();
RequirePermissionsSimpleBatchStateChecker<MyStateEntity2> checker2 = null;
using (RequirePermissionsSimpleBatchStateChecker<MyStateEntity2>.Use(new RequirePermissionsSimpleBatchStateChecker<MyStateEntity2>()))
{
checker2 = RequirePermissionsSimpleBatchStateChecker<MyStateEntity2>.Current;
checker2.ShouldNotBeNull();
checker2.ShouldNotBe(checker);
}
checker2.ShouldNotBeNull();
checker2.ShouldNotBe(checker);
}
[Fact]
public async Task RequirePermissionsSimpleBatchStateChecker_Test()
{
@ -46,5 +65,15 @@ namespace Volo.Abp.Authorization
StateCheckers = new List<ISimpleStateChecker<MyStateEntity>>();
}
}
class MyStateEntity2 : IHasSimpleStateCheckers<MyStateEntity2>
{
public List<ISimpleStateChecker<MyStateEntity2>> StateCheckers { get; }
public MyStateEntity2()
{
StateCheckers = new List<ISimpleStateChecker<MyStateEntity2>>();
}
}
}
}

Loading…
Cancel
Save