Browse Source

Implemented permission store cache invalidations.

pull/216/head
Halil İbrahim Kalkan 9 years ago
parent
commit
6141838564
  1. 12
      src/Volo.Abp.EventBus/Volo/Abp/EventBus/ActionEventHandler.cs
  2. 12
      src/Volo.Abp.EventBus/Volo/Abp/EventBus/AsyncActionEventHandler.cs
  3. 64
      src/Volo.Abp.EventBus/Volo/Abp/EventBus/EventBus.cs
  4. 6
      src/Volo.Abp.EventBus/Volo/Abp/EventBus/IAsyncEventHandler.cs
  5. 84
      src/Volo.Abp.EventBus/Volo/Abp/EventBus/IEventBus.cs
  6. 6
      src/Volo.Abp.EventBus/Volo/Abp/EventBus/IEventHandler.cs
  7. 28
      src/Volo.Abp.EventBus/Volo/Abp/EventBus/NullEventBus.cs
  8. 2
      src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/AbpMongoDbModule.cs
  9. 52
      src/Volo.Abp.Permissions.Domain/Volo/Abp/Permissions/PermissionStore.cs

12
src/Volo.Abp.EventBus/Volo/Abp/EventBus/ActionEventHandler.cs

@ -6,21 +6,21 @@ namespace Volo.Abp.EventBus
/// <summary>
/// This event handler is an adapter to be able to use an action as <see cref="IEventHandler{TEventData}"/> implementation.
/// </summary>
/// <typeparam name="TEventData">Event type</typeparam>
internal class ActionEventHandler<TEventData> :
IEventHandler<TEventData>,
/// <typeparam name="TEvent">Event type</typeparam>
internal class ActionEventHandler<TEvent> :
IEventHandler<TEvent>,
ITransientDependency
{
/// <summary>
/// Action to handle the event.
/// </summary>
public Action<TEventData> Action { get; private set; }
public Action<TEvent> Action { get; private set; }
/// <summary>
/// Creates a new instance of <see cref="ActionEventHandler{TEventData}"/>.
/// </summary>
/// <param name="handler">Action to handle the event</param>
public ActionEventHandler(Action<TEventData> handler)
public ActionEventHandler(Action<TEvent> handler)
{
Action = handler;
}
@ -29,7 +29,7 @@ namespace Volo.Abp.EventBus
/// Handles the event.
/// </summary>
/// <param name="eventData"></param>
public void HandleEvent(TEventData eventData)
public void HandleEvent(TEvent eventData)
{
Action(eventData);
}

12
src/Volo.Abp.EventBus/Volo/Abp/EventBus/AsyncActionEventHandler.cs

@ -7,21 +7,21 @@ namespace Volo.Abp.EventBus
/// <summary>
/// This event handler is an adapter to be able to use an action as <see cref="IAsyncEventHandler{TEventData}"/> implementation.
/// </summary>
/// <typeparam name="TEventData">Event type</typeparam>
internal class AsyncActionEventHandler<TEventData> :
IAsyncEventHandler<TEventData>,
/// <typeparam name="TEvent">Event type</typeparam>
internal class AsyncActionEventHandler<TEvent> :
IAsyncEventHandler<TEvent>,
ITransientDependency
{
/// <summary>
/// Function to handle the event.
/// </summary>
public Func<TEventData, Task> Action { get; }
public Func<TEvent, Task> Action { get; }
/// <summary>
/// Creates a new instance of <see cref="AsyncActionEventHandler{TEventData}"/>.
/// </summary>
/// <param name="handler">Action to handle the event</param>
public AsyncActionEventHandler(Func<TEventData, Task> handler)
public AsyncActionEventHandler(Func<TEvent, Task> handler)
{
Action = handler;
}
@ -30,7 +30,7 @@ namespace Volo.Abp.EventBus
/// Handles the event.
/// </summary>
/// <param name="eventData"></param>
public async Task HandleEventAsync(TEventData eventData)
public async Task HandleEventAsync(TEvent eventData)
{
await Action(eventData);
}

64
src/Volo.Abp.EventBus/Volo/Abp/EventBus/EventBus.cs

@ -64,36 +64,36 @@ namespace Volo.Abp.EventBus
}
/// <inheritdoc/>
public IDisposable Register<TEventData>(Action<TEventData> action)
where TEventData : class
public IDisposable Register<TEvent>(Action<TEvent> action)
where TEvent : class
{
return Register(typeof(TEventData), new ActionEventHandler<TEventData>(action));
return Register(typeof(TEvent), new ActionEventHandler<TEvent>(action));
}
/// <inheritdoc/>
public IDisposable AsyncRegister<TEventData>(Func<TEventData, Task> action) where TEventData : class
public IDisposable AsyncRegister<TEvent>(Func<TEvent, Task> action) where TEvent : class
{
return Register(typeof(TEventData), new AsyncActionEventHandler<TEventData>(action));
return Register(typeof(TEvent), new AsyncActionEventHandler<TEvent>(action));
}
/// <inheritdoc/>
public IDisposable Register<TEventData>(IEventHandler<TEventData> handler) where TEventData : class
public IDisposable Register<TEvent>(IEventHandler<TEvent> handler) where TEvent : class
{
return Register(typeof(TEventData), handler);
return Register(typeof(TEvent), handler);
}
/// <inheritdoc/>
public IDisposable AsyncRegister<TEventData>(IAsyncEventHandler<TEventData> handler) where TEventData : class
public IDisposable AsyncRegister<TEvent>(IAsyncEventHandler<TEvent> handler) where TEvent : class
{
return Register(typeof(TEventData), handler);
return Register(typeof(TEvent), handler);
}
/// <inheritdoc/>
public IDisposable Register<TEventData, THandler>()
where TEventData : class
public IDisposable Register<TEvent, THandler>()
where TEvent : class
where THandler : IEventHandler, new()
{
return Register(typeof(TEventData), new TransientEventHandlerFactory<THandler>());
return Register(typeof(TEvent), new TransientEventHandlerFactory<THandler>());
}
/// <inheritdoc/>
@ -103,9 +103,9 @@ namespace Volo.Abp.EventBus
}
/// <inheritdoc/>
public IDisposable Register<TEventData>(IEventHandlerFactory factory) where TEventData : class
public IDisposable Register<TEvent>(IEventHandlerFactory factory) where TEvent : class
{
return Register(typeof(TEventData), factory);
return Register(typeof(TEvent), factory);
}
/// <inheritdoc/>
@ -118,11 +118,11 @@ namespace Volo.Abp.EventBus
}
/// <inheritdoc/>
public void Unregister<TEventData>(Action<TEventData> action) where TEventData : class
public void Unregister<TEvent>(Action<TEvent> action) where TEvent : class
{
Check.NotNull(action, nameof(action));
GetOrCreateHandlerFactories(typeof(TEventData))
GetOrCreateHandlerFactories(typeof(TEvent))
.Locking(factories =>
{
factories.RemoveAll(
@ -134,7 +134,7 @@ namespace Volo.Abp.EventBus
return false;
}
var actionHandler = singleInstanceFactory.HandlerInstance as ActionEventHandler<TEventData>;
var actionHandler = singleInstanceFactory.HandlerInstance as ActionEventHandler<TEvent>;
if (actionHandler == null)
{
return false;
@ -146,11 +146,11 @@ namespace Volo.Abp.EventBus
}
/// <inheritdoc/>
public void AsyncUnregister<TEventData>(Func<TEventData, Task> action) where TEventData : class
public void AsyncUnregister<TEvent>(Func<TEvent, Task> action) where TEvent : class
{
Check.NotNull(action, nameof(action));
GetOrCreateHandlerFactories(typeof(TEventData))
GetOrCreateHandlerFactories(typeof(TEvent))
.Locking(factories =>
{
factories.RemoveAll(
@ -162,7 +162,7 @@ namespace Volo.Abp.EventBus
return false;
}
var actionHandler = singleInstanceFactory.HandlerInstance as AsyncActionEventHandler<TEventData>;
var actionHandler = singleInstanceFactory.HandlerInstance as AsyncActionEventHandler<TEvent>;
if (actionHandler == null)
{
return false;
@ -174,15 +174,15 @@ namespace Volo.Abp.EventBus
}
/// <inheritdoc/>
public void Unregister<TEventData>(IEventHandler<TEventData> handler) where TEventData : class
public void Unregister<TEvent>(IEventHandler<TEvent> handler) where TEvent : class
{
Unregister(typeof(TEventData), handler);
Unregister(typeof(TEvent), handler);
}
/// <inheritdoc/>
public void AsyncUnregister<TEventData>(IAsyncEventHandler<TEventData> handler) where TEventData : class
public void AsyncUnregister<TEvent>(IAsyncEventHandler<TEvent> handler) where TEvent : class
{
Unregister(typeof(TEventData), handler);
Unregister(typeof(TEvent), handler);
}
/// <inheritdoc/>
@ -200,9 +200,9 @@ namespace Volo.Abp.EventBus
}
/// <inheritdoc/>
public void Unregister<TEventData>(IEventHandlerFactory factory) where TEventData : class
public void Unregister<TEvent>(IEventHandlerFactory factory) where TEvent : class
{
Unregister(typeof(TEventData), factory);
Unregister(typeof(TEvent), factory);
}
/// <inheritdoc/>
@ -212,9 +212,9 @@ namespace Volo.Abp.EventBus
}
/// <inheritdoc/>
public void UnregisterAll<TEventData>() where TEventData : class
public void UnregisterAll<TEvent>() where TEvent : class
{
UnregisterAll(typeof(TEventData));
UnregisterAll(typeof(TEvent));
}
/// <inheritdoc/>
@ -224,9 +224,9 @@ namespace Volo.Abp.EventBus
}
/// <inheritdoc/>
public void Trigger<TEventData>(TEventData eventData) where TEventData : class
public void Trigger<TEvent>(TEvent eventData) where TEvent : class
{
Trigger(typeof(TEventData), eventData);
Trigger(typeof(TEvent), eventData);
}
/// <inheritdoc/>
@ -284,9 +284,9 @@ namespace Volo.Abp.EventBus
}
/// <inheritdoc/>
public Task TriggerAsync<TEventData>(TEventData eventData) where TEventData : class
public Task TriggerAsync<TEvent>(TEvent eventData) where TEvent : class
{
return TriggerAsync(typeof(TEventData), eventData);
return TriggerAsync(typeof(TEvent), eventData);
}
/// <inheritdoc/>

6
src/Volo.Abp.EventBus/Volo/Abp/EventBus/IAsyncEventHandler.cs

@ -5,13 +5,13 @@ namespace Volo.Abp.EventBus
/// <summary>
/// Defines an interface of a class that handles events asynchrounously of type <see cref="IAsyncEventHandler{TEventData}"/>.
/// </summary>
/// <typeparam name="TEventData">Event type to handle</typeparam>
public interface IAsyncEventHandler<in TEventData> : IEventHandler
/// <typeparam name="TEvent">Event type to handle</typeparam>
public interface IAsyncEventHandler<in TEvent> : IEventHandler
{
/// <summary>
/// Handler handles the event by implementing this method.
/// </summary>
/// <param name="eventData">Event data</param>
Task HandleEventAsync(TEventData eventData);
Task HandleEventAsync(TEvent eventData);
}
}

84
src/Volo.Abp.EventBus/Volo/Abp/EventBus/IEventBus.cs

@ -15,45 +15,45 @@ namespace Volo.Abp.EventBus
/// Given action is called for all event occurrences.
/// </summary>
/// <param name="action">Action to handle events</param>
/// <typeparam name="TEventData">Event type</typeparam>
IDisposable Register<TEventData>(Action<TEventData> action)
where TEventData : class;
/// <typeparam name="TEvent">Event type</typeparam>
IDisposable Register<TEvent>(Action<TEvent> action)
where TEvent : class;
/// <summary>
/// Registers to an event.
/// Given action is called for all event occurrences.
/// </summary>
/// <param name="action">Action to handle events</param>
/// <typeparam name="TEventData">Event type</typeparam>
IDisposable AsyncRegister<TEventData>(Func<TEventData, Task> action)
where TEventData : class;
/// <typeparam name="TEvent">Event type</typeparam>
IDisposable AsyncRegister<TEvent>(Func<TEvent, Task> action)
where TEvent : class;
/// <summary>
/// Registers to an event.
/// Same (given) instance of the handler is used for all event occurrences.
/// </summary>
/// <typeparam name="TEventData">Event type</typeparam>
/// <typeparam name="TEvent">Event type</typeparam>
/// <param name="handler">Object to handle the event</param>
IDisposable Register<TEventData>(IEventHandler<TEventData> handler)
where TEventData : class;
IDisposable Register<TEvent>(IEventHandler<TEvent> handler)
where TEvent : class;
/// <summary>
/// Registers to an event.
/// Same (given) instance of the async handler is used for all event occurrences.
/// </summary>
/// <typeparam name="TEventData">Event type</typeparam>
/// <typeparam name="TEvent">Event type</typeparam>
/// <param name="handler">Object to handle the event</param>
IDisposable AsyncRegister<TEventData>(IAsyncEventHandler<TEventData> handler)
where TEventData : class;
IDisposable AsyncRegister<TEvent>(IAsyncEventHandler<TEvent> handler)
where TEvent : class;
/// <summary>
/// Registers to an event.
/// A new instance of <see cref="THandler"/> object is created for every event occurrence.
/// </summary>
/// <typeparam name="TEventData">Event type</typeparam>
/// <typeparam name="TEvent">Event type</typeparam>
/// <typeparam name="THandler">Type of the event handler</typeparam>
IDisposable Register<TEventData, THandler>()
where TEventData : class
IDisposable Register<TEvent, THandler>()
where TEvent : class
where THandler : IEventHandler, new();
/// <summary>
@ -68,10 +68,10 @@ namespace Volo.Abp.EventBus
/// Registers to an event.
/// Given factory is used to create/release handlers
/// </summary>
/// <typeparam name="TEventData">Event type</typeparam>
/// <typeparam name="TEvent">Event type</typeparam>
/// <param name="factory">A factory to create/release handlers</param>
IDisposable Register<TEventData>(IEventHandlerFactory factory)
where TEventData : class;
IDisposable Register<TEvent>(IEventHandlerFactory factory)
where TEvent : class;
/// <summary>
/// Registers to an event.
@ -87,34 +87,34 @@ namespace Volo.Abp.EventBus
/// <summary>
/// Unregisters from an event.
/// </summary>
/// <typeparam name="TEventData">Event type</typeparam>
/// <typeparam name="TEvent">Event type</typeparam>
/// <param name="action"></param>
void Unregister<TEventData>(Action<TEventData> action)
where TEventData : class;
void Unregister<TEvent>(Action<TEvent> action)
where TEvent : class;
/// <summary>
/// Unregisters from an event.
/// </summary>
/// <typeparam name="TEventData">Event type</typeparam>
/// <typeparam name="TEvent">Event type</typeparam>
/// <param name="action"></param>
void AsyncUnregister<TEventData>(Func<TEventData, Task> action)
where TEventData : class;
void AsyncUnregister<TEvent>(Func<TEvent, Task> action)
where TEvent : class;
/// <summary>
/// Unregisters from an event.
/// </summary>
/// <typeparam name="TEventData">Event type</typeparam>
/// <typeparam name="TEvent">Event type</typeparam>
/// <param name="handler">Handler object that is registered before</param>
void Unregister<TEventData>(IEventHandler<TEventData> handler)
where TEventData : class;
void Unregister<TEvent>(IEventHandler<TEvent> handler)
where TEvent : class;
/// <summary>
/// Unregisters from an event.
/// </summary>
/// <typeparam name="TEventData">Event type</typeparam>
/// <typeparam name="TEvent">Event type</typeparam>
/// <param name="handler">Handler object that is registered before</param>
void AsyncUnregister<TEventData>(IAsyncEventHandler<TEventData> handler)
where TEventData : class;
void AsyncUnregister<TEvent>(IAsyncEventHandler<TEvent> handler)
where TEvent : class;
/// <summary>
/// Unregisters from an event.
@ -126,10 +126,10 @@ namespace Volo.Abp.EventBus
/// <summary>
/// Unregisters from an event.
/// </summary>
/// <typeparam name="TEventData">Event type</typeparam>
/// <typeparam name="TEvent">Event type</typeparam>
/// <param name="factory">Factory object that is registered before</param>
void Unregister<TEventData>(IEventHandlerFactory factory)
where TEventData : class;
void Unregister<TEvent>(IEventHandlerFactory factory)
where TEvent : class;
/// <summary>
/// Unregisters from an event.
@ -141,9 +141,9 @@ namespace Volo.Abp.EventBus
/// <summary>
/// Unregisters all event handlers of given event type.
/// </summary>
/// <typeparam name="TEventData">Event type</typeparam>
void UnregisterAll<TEventData>()
where TEventData : class;
/// <typeparam name="TEvent">Event type</typeparam>
void UnregisterAll<TEvent>()
where TEvent : class;
/// <summary>
/// Unregisters all event handlers of given event type.
@ -158,10 +158,10 @@ namespace Volo.Abp.EventBus
/// <summary>
/// Triggers an event.
/// </summary>
/// <typeparam name="TEventData">Event type</typeparam>
/// <typeparam name="TEvent">Event type</typeparam>
/// <param name="eventData">Related data for the event</param>
void Trigger<TEventData>(TEventData eventData)
where TEventData : class;
void Trigger<TEvent>(TEvent eventData)
where TEvent : class;
/// <summary>
/// Triggers an event.
@ -173,11 +173,11 @@ namespace Volo.Abp.EventBus
/// <summary>
/// Triggers an event asynchronously.
/// </summary>
/// <typeparam name="TEventData">Event type</typeparam>
/// <typeparam name="TEvent">Event type</typeparam>
/// <param name="eventData">Related data for the event</param>
/// <returns>The task to handle async operation</returns>
Task TriggerAsync<TEventData>(TEventData eventData)
where TEventData : class;
Task TriggerAsync<TEvent>(TEvent eventData)
where TEvent : class;
/// <summary>
/// Triggers an event asynchronously.

6
src/Volo.Abp.EventBus/Volo/Abp/EventBus/IEventHandler.cs

@ -12,13 +12,13 @@ namespace Volo.Abp.EventBus
/// <summary>
/// Defines an interface of a class that handles events of type <see cref="IEventHandler{TEventData}"/>.
/// </summary>
/// <typeparam name="TEventData">Event type to handle</typeparam>
public interface IEventHandler<in TEventData> : IEventHandler
/// <typeparam name="TEvent">Event type to handle</typeparam>
public interface IEventHandler<in TEvent> : IEventHandler
{
/// <summary>
/// Handler handles the event by implementing this method.
/// </summary>
/// <param name="eventData">Event data</param>
void HandleEvent(TEventData eventData);
void HandleEvent(TEvent eventData);
}
}

28
src/Volo.Abp.EventBus/Volo/Abp/EventBus/NullEventBus.cs

@ -12,27 +12,27 @@ namespace Volo.Abp.EventBus
}
public IDisposable Register<TEventData>(Action<TEventData> action) where TEventData : class
public IDisposable Register<TEvent>(Action<TEvent> action) where TEvent : class
{
return NullDisposable.Instance;
}
public IDisposable AsyncRegister<TEventData>(Func<TEventData, Task> action) where TEventData : class
public IDisposable AsyncRegister<TEvent>(Func<TEvent, Task> action) where TEvent : class
{
return NullDisposable.Instance;
}
public IDisposable Register<TEventData>(IEventHandler<TEventData> handler) where TEventData : class
public IDisposable Register<TEvent>(IEventHandler<TEvent> handler) where TEvent : class
{
return NullDisposable.Instance;
}
public IDisposable AsyncRegister<TEventData>(IAsyncEventHandler<TEventData> handler) where TEventData : class
public IDisposable AsyncRegister<TEvent>(IAsyncEventHandler<TEvent> handler) where TEvent : class
{
return NullDisposable.Instance;
}
public IDisposable Register<TEventData, THandler>() where TEventData : class where THandler : IEventHandler, new()
public IDisposable Register<TEvent, THandler>() where TEvent : class where THandler : IEventHandler, new()
{
return NullDisposable.Instance;
}
@ -42,7 +42,7 @@ namespace Volo.Abp.EventBus
return NullDisposable.Instance;
}
public IDisposable Register<TEventData>(IEventHandlerFactory factory) where TEventData : class
public IDisposable Register<TEvent>(IEventHandlerFactory factory) where TEvent : class
{
return NullDisposable.Instance;
}
@ -52,22 +52,22 @@ namespace Volo.Abp.EventBus
return NullDisposable.Instance;
}
public void Unregister<TEventData>(Action<TEventData> action) where TEventData : class
public void Unregister<TEvent>(Action<TEvent> action) where TEvent : class
{
}
public void AsyncUnregister<TEventData>(Func<TEventData, Task> action) where TEventData : class
public void AsyncUnregister<TEvent>(Func<TEvent, Task> action) where TEvent : class
{
}
public void Unregister<TEventData>(IEventHandler<TEventData> handler) where TEventData : class
public void Unregister<TEvent>(IEventHandler<TEvent> handler) where TEvent : class
{
}
public void AsyncUnregister<TEventData>(IAsyncEventHandler<TEventData> handler) where TEventData : class
public void AsyncUnregister<TEvent>(IAsyncEventHandler<TEvent> handler) where TEvent : class
{
}
@ -77,7 +77,7 @@ namespace Volo.Abp.EventBus
}
public void Unregister<TEventData>(IEventHandlerFactory factory) where TEventData : class
public void Unregister<TEvent>(IEventHandlerFactory factory) where TEvent : class
{
}
@ -87,7 +87,7 @@ namespace Volo.Abp.EventBus
}
public void UnregisterAll<TEventData>() where TEventData : class
public void UnregisterAll<TEvent>() where TEvent : class
{
}
@ -97,7 +97,7 @@ namespace Volo.Abp.EventBus
}
public void Trigger<TEventData>(TEventData eventData) where TEventData : class
public void Trigger<TEvent>(TEvent eventData) where TEvent : class
{
}
@ -107,7 +107,7 @@ namespace Volo.Abp.EventBus
}
public Task TriggerAsync<TEventData>(TEventData eventData) where TEventData : class
public Task TriggerAsync<TEvent>(TEvent eventData) where TEvent : class
{
return Task.CompletedTask;
}

2
src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/AbpMongoDbModule.cs

@ -6,7 +6,7 @@ using Volo.Abp.Uow.MongoDB;
namespace Volo.Abp.MongoDB
{
[DependsOn(typeof(AbpCommonModule))]
[DependsOn(typeof(AbpDddModule))] //TODO: Is it possible to not depend DDD and seperate to another module?
[DependsOn(typeof(AbpDddModule))]
public class AbpMongoDbModule : AbpModule
{
public override void ConfigureServices(IServiceCollection services)

52
src/Volo.Abp.Permissions.Domain/Volo/Abp/Permissions/PermissionStore.cs

@ -3,22 +3,15 @@ using System.Threading.Tasks;
using Microsoft.Extensions.Caching.Distributed;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Entities.Events;
using Volo.Abp.EventBus;
using Volo.Abp.Json;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Threading;
namespace Volo.Abp.Permissions
{
/* TODO:
* - Cache Invalidation (via entity events - eventbus)
* - Wrap distributed cache
* - Add multi-tenancy
* - Add _cancellationTokenProvider support
* - Add object serialization support
* - Wrap in-memory cache!
*/
public class PermissionStore : AbpServiceBase, IPermissionStore, ITransientDependency
public class PermissionStore : AbpServiceBase, IPermissionStore, IAsyncEventHandler<EntityChangedEventData<PermissionGrant>>, ITransientDependency
{
private readonly IPermissionGrantRepository _permissionGrantRepository;
private readonly ICurrentTenant _currentTenant;
@ -42,25 +35,24 @@ namespace Volo.Abp.Permissions
public async Task<bool> IsGrantedAsync(string name, string providerName, string providerKey)
{
return await _permissionGrantRepository.FindAsync(name, providerName, providerKey) != null;
//return (await GetCacheItemAsync(name, providerName, providerKey)).IsGranted; //TODO: Use cache when invalidation is possible!
return (await GetCacheItemAsync(name, providerName, providerKey)).IsGranted;
}
private string CalculateCacheKey(string name, string providerName, string providerKey)
public virtual Task HandleEventAsync(EntityChangedEventData<PermissionGrant> eventData)
{
var key = "P:" + providerName + "#K:" + providerKey + "#N:" + name;
if (_currentTenant.Id.HasValue)
{
key = "T:" + _currentTenant.Id + "#" + key;
}
return key;
return _distributedCache.RemoveAsync(
CalculateCacheKey(
eventData.Entity.Name,
eventData.Entity.ProviderName,
eventData.Entity.ProviderKey,
eventData.Entity.TenantId
)
);
}
private async Task<PermissionGrantCacheItem> GetCacheItemAsync(string name, string providerName, string providerKey)
protected virtual async Task<PermissionGrantCacheItem> GetCacheItemAsync(string name, string providerName, string providerKey)
{
var cacheKey = CalculateCacheKey(name, providerName, providerKey);
var cacheKey = CalculateCacheKey(name, providerName, providerKey, _currentTenant.Id);
var cachedString = await _distributedCache.GetStringAsync(cacheKey, _cancellationTokenProvider.Token);
if (cachedString != null)
@ -82,5 +74,17 @@ namespace Volo.Abp.Permissions
return cacheItem;
}
protected virtual string CalculateCacheKey(string name, string providerName, string providerKey, Guid? tenantId)
{
var key = "N:" + "PermissionGrant" + "#P:" + providerName + "#K:" + providerKey + "#N:" + name;
if (tenantId.HasValue)
{
key += "#T:" + tenantId.Value;
}
return key;
}
}
}

Loading…
Cancel
Save