网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
using System.Threading;
using ZiggyCreatures.Caching.Fusion;

namespace Dpz.Core.Service;

public abstract class AbstractCacheService(IFusionCache fusionCache) : ICacheService
{
    protected abstract string CachePrefixKey { get; }

    protected abstract TimeSpan CacheDefaultExpiration { get; }

    public virtual string BuildCacheKey(string method, object? parameters = null) =>
        GenerateCacheKey.Build(CachePrefixKey, method, parameters);

    public virtual async Task<T> GetOrSetCacheAsync<T>(
        string methodName,
        Func<FusionCacheFactoryExecutionContext<T>, CancellationToken, Task<T>> factory,
        object? parameters = null,
        Action<FusionCacheEntryOptions>? setupAction = null
    )
    {
        var cacheKey = BuildCacheKey(methodName, parameters);
        return await fusionCache.GetOrSetAsync<T>(
            cacheKey,
            async (context, cancellationToken) =>
            {
                context.Tags = [CachePrefixKey, CachePrefixKey + methodName];
                return await factory(context, cancellationToken);
            },
            setupAction ?? (options => options.SetDuration(CacheDefaultExpiration))
        );
    }

    public virtual async ValueTask<MaybeValue<T>> TryGetFromCacheAsync<T>(
        string methodName,
        object? parameters = null
    )
    {
        var cacheKey = BuildCacheKey(methodName, parameters);
        return await fusionCache.TryGetAsync<T>(cacheKey);
    }

    public virtual async Task SetCacheAsync<T>(
        string methodName,
        T value,
        object? parameters = null,
        params string[] additionalTags
    )
    {
        var cacheKey = BuildCacheKey(methodName, parameters);
        var tags = new List<string> { CachePrefixKey, CachePrefixKey + methodName };
        tags.AddRange(additionalTags);
        await fusionCache.SetAsync(
            cacheKey,
            value,
            options => options.SetDuration(CacheDefaultExpiration),
            tags.ToArray()
        );
    }

    public virtual async Task RemoveCacheAsync(string methodName, object? parameters = null)
    {
        var cacheKey = BuildCacheKey(methodName, parameters);
        await fusionCache.RemoveAsync(cacheKey);
    }

    public virtual async Task<IPagedList<T>> GetOrSetPagedListAsync<T>(
        string methodName,
        Func<List<string>, Task<IPagedList<T>>> factory,
        object? parameters = null,
        Action<FusionCacheEntryOptions>? setupAction = null,
        params string[] additionalTags
    )
    {
        var cacheKey = BuildCacheKey(methodName, parameters);
        var cache = await fusionCache.TryGetAsync<PagedListWarp<T>>(cacheKey);
        if (cache.HasValue)
        {
            return cache.Value.ToPagedList();
        }

        var tags = new List<string> { CachePrefixKey, CachePrefixKey + methodName };
        if (additionalTags.Length > 0)
        {
            tags.AddRange(additionalTags);
        }
        var pagedList = await factory(tags);

        await fusionCache.SetAsync(
            cacheKey,
            pagedList.ToPagedListWarp(),
            setupAction ?? (options => options.SetDuration(CacheDefaultExpiration)),
            tags
        );
        return pagedList;
    }

    public virtual ValueTask RemoveByMethodAsync(string methodName)
    {
        return fusionCache.RemoveByTagAsync(CachePrefixKey + methodName);
    }

    public ValueTask RemoveByPrefixAsync()
    {
        return fusionCache.RemoveByTagAsync(CachePrefixKey);
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

上述代码定义了一个抽象类 AbstractCacheService,它实现了一个缓存服务的基础功能,使用了 ZiggyCreatures.Caching.Fusion 库来处理缓存操作。这个类是一个通用的缓存服务,提供了一些方法来管理缓存,包括获取、设置、删除缓存等。以下是对代码功能的详细解释:

1. 类的结构

  • AbstractCacheService 是一个抽象类,必须由具体的子类实现。
  • 它实现了 ICacheService 接口,表明它是一个缓存服务。

2. 抽象属性

  • CachePrefixKey: 子类需要实现的属性,用于定义缓存键的前缀。
  • CacheDefaultExpiration: 子类需要实现的属性,用于定义缓存的默认过期时间。

3. 方法

  • BuildCacheKey: 生成缓存键的方法,使用 CachePrefixKey、方法名和参数来构建唯一的缓存键。

  • GetOrSetCacheAsync:

    • 这是一个异步方法,用于尝试从缓存中获取数据,如果缓存中没有,则调用提供的工厂方法生成数据并将其存入缓存。
    • 支持设置缓存条目的选项(如过期时间)和标签。
  • TryGetFromCacheAsync:

    • 尝试从缓存中获取数据,如果成功则返回一个 MaybeValue<T>,表示可能存在的值。
  • SetCacheAsync:

    • 将数据存入缓存的方法,支持设置额外的标签和过期时间。
  • RemoveCacheAsync:

    • 根据方法名和参数从缓存中删除特定的缓存条目。
  • GetOrSetPagedListAsync:

    • 处理分页列表的缓存逻辑,尝试从缓存中获取分页列表,如果不存在则调用工厂方法生成并缓存结果。
  • RemoveByMethodAsync:

    • 根据方法名删除与该方法相关的所有缓存条目。
  • RemoveByPrefixAsync:

    • 删除所有以 CachePrefixKey 为前缀的缓存条目。

4. 标签管理

  • 在多个方法中,使用标签来管理缓存的生命周期。通过标签,可以批量删除与特定方法或前缀相关的缓存条目。

5. 异步编程

  • 该类的方法大多是异步的,使用 asyncawait 关键字,适合在现代应用程序中处理 I/O 密集型操作,如数据库访问或网络请求。

总结

AbstractCacheService 提供了一种灵活的方式来管理缓存,允许子类根据具体需求实现缓存键和过期策略。它封装了常见的缓存操作,使得开发者可以专注于业务逻辑,而不必重复实现缓存管理的细节。

loading