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.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
@ -8,6 +9,7 @@ using Volo.Abp.AspNetCore.Mvc.UI.Theming;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.DependencyInjection;
using Volo.Abp.SimpleStateChecking;
using Volo.Abp.Threading;
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 IServiceProvider ServiceProvider { get; }
protected ISimpleStateCheckerManager<ToolbarItem> SimpleStateCheckerManager { get; }
protected SemaphoreSlim SyncSemaphore { get; }
public ToolbarManager(
IOptions<AbpToolbarOptions> options,
@ -28,6 +31,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Toolbars
SimpleStateCheckerManager = simpleStateCheckerManager;
ServiceProvider = serviceProvider;
Options = options.Value;
SyncSemaphore = new SemaphoreSlim(1, 1);
}
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())
{
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)
{
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;

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

@ -1,11 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.DependencyInjection;
using Volo.Abp.SimpleStateChecking;
using Volo.Abp.Threading;
namespace Volo.Abp.UI.Navigation
{
@ -14,6 +16,7 @@ namespace Volo.Abp.UI.Navigation
protected AbpNavigationOptions Options { get; }
protected IHybridServiceScopeFactory ServiceScopeFactory { get; }
protected ISimpleStateCheckerManager<ApplicationMenuItem> SimpleStateCheckerManager { get; }
protected SemaphoreSlim SyncSemaphore { get; }
public MenuManager(
IOptions<AbpNavigationOptions> options,
@ -23,6 +26,7 @@ namespace Volo.Abp.UI.Navigation
Options = options.Value;
ServiceScopeFactory = serviceScopeFactory;
SimpleStateCheckerManager = simpleStateCheckerManager;
SyncSemaphore = new SemaphoreSlim(1, 1);
}
public async Task<ApplicationMenu> GetAsync(string name)
@ -31,16 +35,19 @@ namespace Volo.Abp.UI.Navigation
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)
{
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);

Loading…
Cancel
Save