using Dpz.Core.Public.ViewModel.Response;

namespace Dpz.Core.Service.RepositoryServiceImpl;

public class SystemNotificationHistoryService(
    IRepository<SystemNotificationHistory> repository,
    IMapper mapper,
    IFusionCache fusionCache
) : AbstractCacheService(fusionCache), ISystemNotificationHistoryService
{
    protected override TimeSpan CacheDefaultExpiration => TimeSpan.FromHours(1);

    public async Task<List<SystemNotificationHistoryResponse>> GetRecentAsync(
        CancellationToken cancellationToken = default
    )
    {
        return await GetOrSetCacheAsync<List<SystemNotificationHistoryResponse>>(
            nameof(GetRecentAsync),
            async (_, ct) =>
            {
                var sort = Builders<SystemNotificationHistory>.Sort.Descending(x => x.CreateTime);
                var items = await repository
                    .Collection.Find(FilterDefinition<SystemNotificationHistory>.Empty)
                    .Sort(sort)
                    .Limit(5)
                    .ToListAsync(ct);
                return mapper.Map<List<SystemNotificationHistoryResponse>>(items);
            },
            cancellationToken: cancellationToken
        );
    }

    public async Task SaveAsync(string message, CancellationToken cancellationToken = default)
    {
        var entity = new SystemNotificationHistory { Message = message, CreateTime = DateTime.Now };
        await repository.InsertAsync(entity, cancellationToken);
        await RemoveCacheAsync(nameof(GetRecentAsync), cancellationToken: cancellationToken);
    }

    public async Task<IPagedList<SystemNotificationHistoryResponse>> GetPageAsync(
        int pageIndex,
        int pageSize,
        CancellationToken cancellationToken = default
    )
    {
        var sort = Builders<SystemNotificationHistory>.Sort.Descending(x => x.CreateTime);
        return await repository
            .Collection.Find(FilterDefinition<SystemNotificationHistory>.Empty)
            .Sort(sort)
            .ToPagedListAsync<SystemNotificationHistory, SystemNotificationHistoryResponse>(
                pageIndex,
                pageSize,
                cancellationToken
            );
    }

    public async Task DeleteAsync(string id, CancellationToken cancellationToken = default)
    {
        // 智能缓存清除:仅当被删除的记录在已缓存的最近通知列表中时才清除缓存
        var cached = await TryGetFromCacheAsync<List<SystemNotificationHistoryResponse>>(
            nameof(GetRecentAsync),
            cancellationToken: cancellationToken
        );
        await repository.TryDeleteAsync(id, cancellationToken);
        if (cached.HasValue && cached.Value.Any(x => x.Id == id))
        {
            await RemoveCacheAsync(nameof(GetRecentAsync), cancellationToken: cancellationToken);
        }
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这是一个系统通知历史记录服务类的实现,主要功能是管理系统通知的历史记录,包括增删查改操作以及智能缓存管理。让我详细解释各个部分:

类的结构和依赖注入

public class SystemNotificationHistoryService(
    IRepository<SystemNotificationHistory> repository,
    IMapper mapper,
    IFusionCache fusionCache
) : AbstractCacheService(fusionCache), ISystemNotificationHistoryService
  • 使用了主构造函数(C# 12的新特性)来注入依赖
  • 继承自 AbstractCacheService,具备缓存功能
  • 实现了 ISystemNotificationHistoryService 接口
  • 注入的依赖:
    • repository: 数据访问层
    • mapper: 对象映射器(如AutoMapper)
    • fusionCache: 缓存组件

缓存配置

protected override TimeSpan CacheDefaultExpiration => TimeSpan.FromHours(1);

设置缓存默认过期时间为1小时。

核心功能方法

1. 获取最近通知 (GetRecentAsync)

public async Task<List<SystemNotificationHistoryResponse>> GetRecentAsync(...)
  • 缓存策略: 使用 GetOrSetCacheAsync 实现缓存读取/设置
  • 数据查询: 按创建时间降序排序,限制返回5条记录
  • 数据转换: 使用mapper将实体转换为响应DTO

2. 保存通知 (SaveAsync)

public async Task SaveAsync(string message, CancellationToken cancellationToken = default)
  • 创建新的通知历史记录实体
  • 插入数据库
  • 智能缓存失效: 删除相关缓存,确保数据一致性

3. 分页查询 (GetPageAsync)

public async Task<IPagedList<SystemNotificationHistoryResponse>> GetPageAsync(...)
  • 支持分页查询
  • 按创建时间降序排序
  • 使用扩展方法 ToPagedListAsync 进行分页处理和对象映射

4. 删除通知 (DeleteAsync)

public async Task DeleteAsync(string id, CancellationToken cancellationToken = default)
  • 智能缓存清除策略:
    1. 先检查要删除的记录是否在已缓存的最近通知列表中
    2. 执行删除操作
    3. 只有当删除的记录确实在缓存中时,才清除缓存
  • 这种策略避免了不必要的缓存清除,提升性能

设计亮点

  1. 智能缓存管理: 在删除操作中,只有当删除的记录真正影响到缓存数据时才清除缓存
  2. 一致的异步模式: 所有方法都支持 CancellationToken
  3. MongoDB集成: 使用MongoDB的 BuildersFilterDefinition
  4. 分离关注点: 数据访问、对象映射、缓存管理职责清晰分离
  5. 类型安全: 泛型使用确保类型安全

这个服务类展现了现代.NET应用中良好的架构设计,结合了缓存、异步编程、依赖注入等最佳实践。

评论加载中...