网站首页 网站源码
using ZiggyCreatures.Caching.Fusion;
namespace Dpz.Core.Service.V4.Implements;
public class PictureRecordService(
IRepository<PictureRecord> repository,
IMapper mapper,
IFusionCache fusionCache
) : AbstractCacheService(fusionCache), IPictureRecordService
{
protected override string CachePrefixKey =>
"Dpz.Core.Service.V4.Implements.PictureRecordService";
protected override TimeSpan CacheDefaultExpiration => TimeSpan.FromDays(1);
private readonly IFusionCache _fusionCache = fusionCache;
public async Task<ICollection<string>> GetTagsAsync()
{
return await GetOrSetCacheAsync<List<string>>(
nameof(GetTagsAsync),
async (_, cancellationToken) =>
{
var tags = await repository
.MongodbQueryable
//.Select(x => x.Tags)
.SelectMany(x => x.Tags)
.GroupBy(x => x)
.Select(x => x.Key)
.ToListAsync(cancellationToken);
return tags;
}
);
}
public async Task<ICollection<VmPictureRecord>> GetBannerAsync()
{
return await GetOrSetCacheAsync<List<VmPictureRecord>>(
nameof(GetBannerAsync),
async (_, _) =>
{
var pagedList = await repository
.SearchFor(x => x.Tags.Any(y => y == "banner"))
.OrderByDescending(x => x.UploadTime)
.ToListAsync<PictureRecord, VmPictureRecord>();
pagedList.ForEach(x => x.AccessUrl += "!banner");
return pagedList;
}
);
}
public async Task<IPagedList<VmPictureRecord>> GetPagesAsync(
List<string>? tags,
string? description,
int pageIndex = 1,
int pageSize = 20
)
{
return await GetOrSetPagedListAsync<VmPictureRecord>(
nameof(GetPagesAsync),
async _ =>
{
var filterEmpty = Builders<PictureRecord>.Filter.Empty;
var filters = new List<FilterDefinition<PictureRecord>>();
var clearTags =
tags?.Where(x => !string.IsNullOrEmpty(x)).Select(x => x).ToList() ?? [];
if (clearTags.Count > 0)
{
var filter = Builders<PictureRecord>.Filter.AnyIn(x => x.Tags, clearTags);
filters.Add(filter);
}
if (!string.IsNullOrEmpty(description))
{
var filter = Builders<PictureRecord>.Filter.Regex(
x => x.Description,
new BsonRegularExpression(description, "i")
);
filters.Add(filter);
}
var filterResult =
filters.Count > 0 ? Builders<PictureRecord>.Filter.And(filters) : filterEmpty;
return await repository
.SearchFor(filterResult)
.SortByDescending(x => x.Id)
.ToPagedListAsync<PictureRecord, VmPictureRecord>(pageIndex, pageSize);
},
new
{
tags,
description,
pageIndex,
pageSize,
}
);
}
public async Task<VmPictureRecord?> GetPictureRecordAsync(string id)
{
return await GetOrSetCacheAsync<VmPictureRecord?>(
nameof(GetPictureRecordAsync),
async (_, _) =>
{
var entity = await repository.TryGetAsync(id);
return entity == null ? null : mapper.Map<VmPictureRecord>(entity);
},
new { id }
);
}
public async Task<VmPictureRecord> CreateRecordAsync(VmPictureRecord pictureRecord)
{
var entity = mapper.Map<PictureRecord>(pictureRecord);
await repository.InsertAsync(entity);
if (entity.Tags.Any(x => x == "banner"))
{
await _fusionCache.RemoveAsync(CacheKey.HomeContainerKey);
}
await ClearCacheAsync();
return mapper.Map<VmPictureRecord>(entity);
}
public async Task<VmPictureRecord?> ChangeInformationAsync(VmPictureRecordChange change)
{
if (!ObjectId.TryParse(change.Id, out var oid))
{
return null;
}
var update = Builders<PictureRecord>
.Update.Set(x => x.Category, change.Category)
.Set(x => x.Description, change.Description)
.Set(x => x.Tags, change.Tags);
await repository.UpdateAsync(x => x.Id == oid, update);
if (change.Tags.Any(x => x == "banner"))
{
await _fusionCache.RemoveAsync(CacheKey.HomeContainerKey);
}
await ClearCacheAsync();
var entity = await repository.FindAsync(oid);
return entity == null ? null : mapper.Map<VmPictureRecord>(entity);
}
public async Task DeleteAsync(string id)
{
var entity = await repository.TryGetAsync(id);
if (entity == null)
{
return;
}
await ClearCacheAsync();
await repository.DeleteAsync(entity.Id);
}
public async Task ClearCacheAsync()
{
var removeTags = new[]
{
CachePrefixKey + nameof(GetTagsAsync),
CachePrefixKey + nameof(GetPagesAsync),
CachePrefixKey + nameof(GetBannerAsync),
CachePrefixKey + nameof(GetPictureRecordAsync),
};
await _fusionCache.RemoveByTagAsync(removeTags);
}
}
上述代码定义了一个名为 PictureRecordService
的服务类,它实现了 IPictureRecordService
接口,主要用于处理与图片记录相关的操作。以下是该类的主要功能和方法的详细解释:
public PictureRecordService(IHybridCachingProvider cachingProvider, IRepository<PictureRecord> repository, IMapper mapper)
public async Task<ICollection<string>> GetTagsAsync()
SelectMany
将所有图片记录的标签扁平化,然后通过 GroupBy
和 Select
获取唯一标签列表。public async Task SetBannerAsync(string id)
public async Task<ICollection<VmPictureRecord>> GetBannerAsync()
public async Task<IPagedList<VmPictureRecord>> GetPagesAsync(ICollection<string>? tags, string? description, int pageIndex = 1, int pageSize = 20)
public async Task<VmPictureRecord?> GetPictureRecordAsync(string id)
VmPictureRecord
。public async Task<VmPictureRecord> CreateRecordAsync(VmPictureRecord pictureRecord)
public async Task<VmPictureRecord?> ChangeInformationAsync(VmPictureRecordChange change)
public async Task DeleteAsync(string id)
PictureRecordService
类提供了一系列与图片记录相关的操作,包括获取标签、设置和获取横幅、分页查询、创建、更新和删除记录。它利用了 MongoDB 的查询功能和对象映射器来简化数据操作,同时通过缓存机制提高性能。