BotSharp/src/Infrastructure/BotSharp.Abstraction/Infrastructures/SharpCacheAttribute.cs

66 lines
1.6 KiB
C#
Raw Normal View History

2024-08-22 11:54:50 +00:00
using BotSharp.Abstraction.Infrastructures;
using Microsoft.Extensions.DependencyInjection;
using Rougamo;
using Rougamo.Context;
namespace BotSharp.Core.Infrastructures;
public class SharpCacheAttribute : MoAttribute
{
public static IServiceProvider Services { get; set; } = null!;
private int _minutes;
2024-08-23 01:13:43 +00:00
private string _prefix;
public SharpCacheAttribute(int minutes, string prefix = "cache")
2024-08-22 11:54:50 +00:00
{
_minutes = minutes;
2024-08-23 01:13:43 +00:00
_prefix = prefix;
2024-08-22 11:54:50 +00:00
}
public override void OnEntry(MethodContext context)
{
var cache = Services.GetRequiredService<ICacheService>();
var key = GetCacheKey(context);
var value = cache.GetAsync(key, context.TaskReturnType).Result;
if (value != null)
{
context.ReplaceReturnValue(this, value);
}
}
public override void OnSuccess(MethodContext context)
{
var cache = Services.GetRequiredService<ICacheService>();
if (context.ReturnValue != null)
{
var key = GetCacheKey(context);
cache.SetAsync(key, context.ReturnValue, new TimeSpan(0, _minutes, 0)).Wait();
}
}
private string GetCacheKey(MethodContext context)
{
2024-08-23 01:13:43 +00:00
var key = _prefix;
2024-08-22 11:54:50 +00:00
foreach (var arg in context.Arguments)
{
if (arg is null)
{
key += "-" + "<NULL>";
}
else if (arg is ICacheKey withCacheKey)
{
key += "-" + withCacheKey.GetCacheKey();
}
else
{
key += "-" + arg.ToString();
}
}
return key;
}
}