Browse Source

Use locks to prevent concurrency confusion.

I will re-think this design.
pull/9046/head
maliming 5 years ago
parent
commit
c792389b41
  1. 21
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarManager.cs
  2. 21
      framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs

21
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Toolbars/ToolbarManager.cs

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
@ -8,6 +9,7 @@ using Volo.Abp.AspNetCore.Mvc.UI.Theming;
using Volo.Abp.Authorization.Permissions; using Volo.Abp.Authorization.Permissions;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.SimpleStateChecking; using Volo.Abp.SimpleStateChecking;
using Volo.Abp.Threading;
namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars
{ {
@ -17,6 +19,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars
protected AbpToolbarOptions Options { get; } protected AbpToolbarOptions Options { get; }
protected IServiceProvider ServiceProvider { get; } protected IServiceProvider ServiceProvider { get; }
protected ISimpleStateCheckerManager<ToolbarItem> SimpleStateCheckerManager { get; } protected ISimpleStateCheckerManager<ToolbarItem> SimpleStateCheckerManager { get; }
protected SemaphoreSlim SyncSemaphore { get; }
public ToolbarManager( public ToolbarManager(
IOptions<AbpToolbarOptions> options, IOptions<AbpToolbarOptions> options,
@ -28,6 +31,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars
SimpleStateCheckerManager = simpleStateCheckerManager; SimpleStateCheckerManager = simpleStateCheckerManager;
ServiceProvider = serviceProvider; ServiceProvider = serviceProvider;
Options = options.Value; Options = options.Value;
SyncSemaphore = new SemaphoreSlim(1, 1);
} }
public async Task<Toolbar> GetAsync(string name) public async Task<Toolbar> GetAsync(string name)
@ -36,16 +40,19 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars
using (var scope = ServiceProvider.CreateScope()) using (var scope = ServiceProvider.CreateScope())
{ {
RequirePermissionsSimpleBatchStateChecker<ToolbarItem>.Instance.ClearCheckModels(); using (await SyncSemaphore.LockAsync())
{
RequirePermissionsSimpleBatchStateChecker<ToolbarItem>.Instance.ClearCheckModels();
var context = new ToolbarConfigurationContext(ThemeManager.CurrentTheme, toolbar, scope.ServiceProvider); var context = new ToolbarConfigurationContext(ThemeManager.CurrentTheme, toolbar, scope.ServiceProvider);
foreach (var contributor in Options.Contributors) foreach (var contributor in Options.Contributors)
{ {
await contributor.ConfigureToolbarAsync(context); await contributor.ConfigureToolbarAsync(context);
} }
await CheckPermissionsAsync(scope.ServiceProvider, toolbar); await CheckPermissionsAsync(scope.ServiceProvider, toolbar);
}
} }
return toolbar; return toolbar;

21
framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/MenuManager.cs

@ -1,11 +1,13 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Volo.Abp.Authorization.Permissions; using Volo.Abp.Authorization.Permissions;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.SimpleStateChecking; using Volo.Abp.SimpleStateChecking;
using Volo.Abp.Threading;
namespace Volo.Abp.UI.Navigation namespace Volo.Abp.UI.Navigation
{ {
@ -14,6 +16,7 @@ namespace Volo.Abp.UI.Navigation
protected AbpNavigationOptions Options { get; } protected AbpNavigationOptions Options { get; }
protected IHybridServiceScopeFactory ServiceScopeFactory { get; } protected IHybridServiceScopeFactory ServiceScopeFactory { get; }
protected ISimpleStateCheckerManager<ApplicationMenuItem> SimpleStateCheckerManager { get; } protected ISimpleStateCheckerManager<ApplicationMenuItem> SimpleStateCheckerManager { get; }
protected SemaphoreSlim SyncSemaphore { get; }
public MenuManager( public MenuManager(
IOptions<AbpNavigationOptions> options, IOptions<AbpNavigationOptions> options,
@ -23,6 +26,7 @@ namespace Volo.Abp.UI.Navigation
Options = options.Value; Options = options.Value;
ServiceScopeFactory = serviceScopeFactory; ServiceScopeFactory = serviceScopeFactory;
SimpleStateCheckerManager = simpleStateCheckerManager; SimpleStateCheckerManager = simpleStateCheckerManager;
SyncSemaphore = new SemaphoreSlim(1, 1);
} }
public async Task<ApplicationMenu> GetAsync(string name) public async Task<ApplicationMenu> GetAsync(string name)
@ -31,16 +35,19 @@ namespace Volo.Abp.UI.Navigation
using (var scope = ServiceScopeFactory.CreateScope()) using (var scope = ServiceScopeFactory.CreateScope())
{ {
RequirePermissionsSimpleBatchStateChecker<ApplicationMenuItem>.Instance.ClearCheckModels(); using (await SyncSemaphore.LockAsync())
{
RequirePermissionsSimpleBatchStateChecker<ApplicationMenuItem>.Instance.ClearCheckModels();
var context = new MenuConfigurationContext(menu, scope.ServiceProvider); var context = new MenuConfigurationContext(menu, scope.ServiceProvider);
foreach (var contributor in Options.MenuContributors) foreach (var contributor in Options.MenuContributors)
{ {
await contributor.ConfigureMenuAsync(context); await contributor.ConfigureMenuAsync(context);
} }
await CheckPermissionsAsync(scope.ServiceProvider, menu); await CheckPermissionsAsync(scope.ServiceProvider, menu);
}
} }
NormalizeMenu(menu); NormalizeMenu(menu);

Loading…
Cancel
Save