网站首页 网站源码
using Dpz.Core.Public.ViewModel.RequestEvent;
using ZiggyCreatures.Caching.Fusion;
namespace Dpz.Core.Service.V4.Implements;
public class MumbleService(
IRepository<Mumble> repository,
IMapper mapper,
IMediator mediator,
IFusionCache fusionCache
) : AbstractCacheService(fusionCache), IMumbleService
{
protected override string CachePrefixKey => "Dpz.Core.Service.V4.Implements.MumbleService";
protected override TimeSpan CacheDefaultExpiration => TimeSpan.FromDays(3);
private readonly IFusionCache _fusionCache = fusionCache;
private async Task ClearCacheAsync()
{
var tags = new[]
{
CachePrefixKey + nameof(GetPagesAsync),
CachePrefixKey + nameof(GetRandomMumblesAsync),
CachePrefixKey + nameof(FindAsync),
};
await _fusionCache.RemoveByTagAsync(tags);
}
public async Task<VmMumble> CreateAsync(VmMumble talk)
{
var entity = mapper.Map<Mumble>(talk);
await repository.InsertAsync(entity);
await ClearCacheAsync();
return mapper.Map<VmMumble>(entity);
}
public async Task<VmMumble?> EditContentAsync(VmMumble mumble)
{
if (mumble == null)
throw new ArgumentNullException(nameof(mumble));
if (mumble.Markdown == null)
throw new ArgumentNullException(nameof(mumble.Markdown));
if (mumble.HtmlContent == null)
throw new ArgumentNullException(nameof(mumble.HtmlContent));
var entity = await repository.TryGetAsync(mumble.Id);
if (entity == null)
return null;
var request = new EditMarkdownRequest
{
Markdown = mumble.Markdown,
OriginalMarkdown = entity.Markdown,
};
await mediator.Send(request);
var update = Builders<Mumble>
.Update.Set(x => x.HtmlContent, mumble.HtmlContent)
.Set(x => x.Markdown, mumble.Markdown)
.Set(x => x.LastUpdateTime, DateTime.Now);
await repository.UpdateAsync(x => x.Id == entity.Id, update);
await ClearCacheAsync();
return mapper.Map<VmMumble>(await repository.FindAsync(entity.Id));
}
public async Task<IPagedList<VmMumble>> GetPagesAsync(
int pageIndex,
int pageSize,
string? content = null,
string? account = null
)
{
return await GetOrSetPagedListAsync(
nameof(GetPagesAsync),
async _ =>
{
var predicate = repository.SearchFor(x => true);
if (!string.IsNullOrEmpty(content))
predicate = predicate.Where(x => x.Markdown.Contains(content));
if (!string.IsNullOrEmpty(account))
predicate = predicate.Where(x => x.Author.Id == account);
return await predicate
.OrderByDescending(x => x.CreateTime)
.ToPagedListAsync<Mumble, VmMumble>(pageIndex, pageSize);
},
new
{
content,
account,
pageIndex,
pageSize,
}
);
}
public async Task<List<VmMumble>> GetRandomMumblesAsync(int count)
{
return await GetOrSetCacheAsync<List<VmMumble>>(
nameof(GetRandomMumblesAsync),
async (_, cancellationToken) =>
{
var date = DateTime.Now;
var data = await repository
.SearchFor(x =>
x.CreateTime.Month == date.Month
&& x.CreateTime.Day == date.Day
&& x.CreateTime.Year != date.Year
)
.Take(count)
.OrderByDescending(x => x.CreateTime)
.ToListAsync(cancellationToken);
if (data.Count == 0)
{
data = await repository.SearchFor(x => true).Sample(count).ToListAsync();
}
return mapper.Map<List<VmMumble>>(data);
},
new { count },
x => x.SetDuration(TimeSpan.FromHours(3))
);
}
public async Task<VmMumble?> FindAsync(string id)
{
return await GetOrSetCacheAsync<VmMumble?>(
nameof(FindAsync),
async (_, _) => mapper.Map<VmMumble?>(await repository.TryGetAsync(id)),
new { id }
);
}
public async Task DeleteAsync(params string[] id)
{
var list = await repository.TryGetListAsync(id);
var request = new DeleteMarkdownRequest
{
Markdown = list.Select(x => x.Markdown).ToList(),
};
await mediator.Send(request);
await repository.TryDeleteAsync(id);
await ClearCacheAsync();
}
public async Task<VmMumble?> LikeAsync(string id)
{
var entity = await repository.TryGetAsync(id);
if (entity is null)
return null;
entity.Like += 1;
var update = Builders<Mumble>.Update.Inc(x => x.Like, 1);
await repository.UpdateAsync(z => z.Id == entity.Id, update);
await ClearCacheAsync();
return mapper.Map<VmMumble>(entity);
}
}
上述代码定义了一个名为 MumbleService
的服务类,它实现了 IMumbleService
接口,提供了一系列与 Mumble
实体相关的操作。以下是对每个方法的详细解释:
CreateAsync:
Mumble
实体。VmMumble
视图模型。Mumble
实体,插入到数据库中,并返回映射后的视图模型。EditContentAsync:
Mumble
实体的内容。VmMumble
视图模型。null
,并确保 Markdown 和 HTML 内容不为空。Mumble
实体。EditMarkdownRequest
),更新 Markdown 内容。GetPagesAsync:
Mumble
列表。Mumble
列表,按创建时间降序排列。GetRandomMumblesAsync:
Mumble
实体。Mumble
实体。如果没有找到,则从所有 Mumble
中随机选择指定数量的实体。FindAsync:
Mumble
实体。Mumble
实体,并返回映射后的视图模型。DeleteAsync:
Mumble
实体。DeleteMarkdownRequest
),然后从数据库中删除这些实体。LikeAsync:
Mumble
实体增加一个点赞。Mumble
实体,如果存在,则增加其点赞数,并更新数据库中的点赞数,最后返回更新后的视图模型。MumbleService
类提供了对 Mumble
实体的基本 CRUD(创建、读取、更新、删除)操作,以及一些额外的功能,如获取随机实体和点赞功能。它使用了依赖注入的方式来获取 IRepository<Mumble>
、IMapper
和 IMediator
,以便于进行数据访问、对象映射和请求处理。