From cf9f31719ca141c7fa0e5444a3e081675e74d2b0 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 29 Dec 2025 20:15:00 +0800 Subject: [PATCH] Refactor StaticPermissionDefinitionStore to use caches --- .../StaticPermissionDefinitionStore.cs | 134 +++++++++--------- 1 file changed, 66 insertions(+), 68 deletions(-) diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/StaticPermissionDefinitionStore.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/StaticPermissionDefinitionStore.cs index 5ac2257060..2f95f3fef6 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/StaticPermissionDefinitionStore.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/StaticPermissionDefinitionStore.cs @@ -6,76 +6,72 @@ using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; +using Volo.Abp.StaticDefinitions; namespace Volo.Abp.Authorization.Permissions; public class StaticPermissionDefinitionStore : IStaticPermissionDefinitionStore, ISingletonDependency { - protected IDictionary PermissionGroupDefinitions => _lazyPermissionGroupDefinitions.Value.Item1; - private readonly Lazy<(Dictionary, List)> _lazyPermissionGroupDefinitions; - - protected IDictionary PermissionDefinitions => _lazyPermissionDefinitions.Value; - private readonly Lazy> _lazyPermissionDefinitions; - - protected IList ResourcePermissionDefinitions => _lazyPermissionGroupDefinitions.Value.Item2; - + protected IServiceProvider ServiceProvider { get; } protected AbpPermissionOptions Options { get; } - - private readonly IServiceProvider _serviceProvider; + protected IStaticDefinitionCache, List)> GroupCache { get; } + protected IStaticDefinitionCache> DefinitionCache { get; } public StaticPermissionDefinitionStore( IServiceProvider serviceProvider, - IOptions options) + IOptions options, + IStaticDefinitionCache, List)> groupCache, + IStaticDefinitionCache> definitionCache) { - _serviceProvider = serviceProvider; + ServiceProvider = serviceProvider; Options = options.Value; + GroupCache = groupCache; + DefinitionCache = definitionCache; + } - _lazyPermissionDefinitions = new Lazy>( - CreatePermissionDefinitions, - isThreadSafe: true - ); - - _lazyPermissionGroupDefinitions = new Lazy<(Dictionary, List)>( - CreatePermissionGroupDefinitions, - isThreadSafe: true - ); + public async Task GetOrNullAsync(string name) + { + var defs = await GetPermissionDefinitionsAsync(); + return defs.GetOrDefault(name); } - protected virtual Dictionary CreatePermissionDefinitions() + public virtual async Task> GetPermissionsAsync() { - var permissions = new Dictionary(); + var defs = await GetPermissionDefinitionsAsync(); + return defs.Values.ToImmutableList(); + } - foreach (var groupDefinition in PermissionGroupDefinitions.Values) - { - foreach (var permission in groupDefinition.Permissions) - { - AddPermissionToDictionaryRecursively(permissions, permission); - } - } + public virtual async Task GetResourcePermissionOrNullAsync(string resourceName, string name) + { + var (_, resourcePermissions) = await GetPermissionGroupDefinitionsAsync(); + return resourcePermissions.FirstOrDefault(p => p.ResourceName == resourceName && p.Name == name); + } - return permissions; + public virtual async Task> GetResourcePermissionsAsync() + { + var (_, resourcePermissions) = await GetPermissionGroupDefinitionsAsync(); + return resourcePermissions.ToImmutableList(); } - protected virtual void AddPermissionToDictionaryRecursively( - Dictionary permissions, - PermissionDefinition permission) + public async Task> GetGroupsAsync() { - if (permissions.ContainsKey(permission.Name)) - { - throw new AbpException("Duplicate permission name: " + permission.Name); - } + var (groups, _) = await GetPermissionGroupDefinitionsAsync(); + return groups.Values.ToImmutableList(); + } - permissions[permission.Name] = permission; + protected virtual async Task<(Dictionary, List)> GetPermissionGroupDefinitionsAsync() + { + return await GroupCache.GetOrCreateAsync(CreatePermissionGroupDefinitionsAsync); + } - foreach (var child in permission.Children) - { - AddPermissionToDictionaryRecursively(permissions, child); - } + protected virtual async Task> GetPermissionDefinitionsAsync() + { + return await DefinitionCache.GetOrCreateAsync(CreatePermissionDefinitionsAsync); } - protected virtual (Dictionary, List) CreatePermissionGroupDefinitions() + protected virtual Task<(Dictionary, List)> CreatePermissionGroupDefinitionsAsync() { - using (var scope = _serviceProvider.CreateScope()) + using (var scope = ServiceProvider.CreateScope()) { var context = new PermissionDefinitionContext(scope.ServiceProvider); @@ -104,38 +100,40 @@ public class StaticPermissionDefinitionStore : IStaticPermissionDefinitionStore, context.CurrentProvider = null; - return (context.Groups, context.ResourcePermissions); + return Task.FromResult((context.Groups, context.ResourcePermissions)); } } - public Task GetOrNullAsync(string name) + protected virtual async Task> CreatePermissionDefinitionsAsync() { - return Task.FromResult(PermissionDefinitions.GetOrDefault(name)); - } + var permissions = new Dictionary(); - public virtual Task> GetPermissionsAsync() - { - return Task.FromResult>( - PermissionDefinitions.Values.ToImmutableList() - ); - } + var (groups, _) = await GetPermissionGroupDefinitionsAsync(); + foreach (var groupDefinition in groups.Values) + { + foreach (var permission in groupDefinition.Permissions) + { + AddPermissionToDictionaryRecursively(permissions, permission); + } + } - public virtual Task GetResourcePermissionOrNullAsync(string resourceName, string name) - { - return Task.FromResult(ResourcePermissionDefinitions.FirstOrDefault(p => p.ResourceName == resourceName && p.Name == name)); + return permissions; } - public virtual Task> GetResourcePermissionsAsync() + protected virtual void AddPermissionToDictionaryRecursively( + Dictionary permissions, + PermissionDefinition permission) { - return Task.FromResult>( - ResourcePermissionDefinitions.ToImmutableList() - ); - } + if (permissions.ContainsKey(permission.Name)) + { + throw new AbpException("Duplicate permission name: " + permission.Name); + } - public Task> GetGroupsAsync() - { - return Task.FromResult>( - PermissionGroupDefinitions.Values.ToImmutableList() - ); + permissions[permission.Name] = permission; + + foreach (var child in permission.Children) + { + AddPermissionToDictionaryRecursively(permissions, child); + } } }