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)
- 智能缓存清除策略:
- 先检查要删除的记录是否在已缓存的最近通知列表中
- 执行删除操作
- 只有当删除的记录确实在缓存中时,才清除缓存
- 这种策略避免了不必要的缓存清除,提升性能
设计亮点
- 智能缓存管理: 在删除操作中,只有当删除的记录真正影响到缓存数据时才清除缓存
- 一致的异步模式: 所有方法都支持
CancellationToken - MongoDB集成: 使用MongoDB的
Builders和FilterDefinition - 分离关注点: 数据访问、对象映射、缓存管理职责清晰分离
- 类型安全: 泛型使用确保类型安全
这个服务类展现了现代.NET应用中良好的架构设计,结合了缓存、异步编程、依赖注入等最佳实践。
评论加载中...