初试 .NET CQRS 开源库 LiteBus
最近在找 MediatR 的替代,看了 LiteBus 作者的博文 LiteBus: A Free and Ambitious Alternative to MediatR for .NET Applications 后,看中了 LiteBus,这篇博文记录一下初步使用 LiteBus 的步骤。
Query 层安装 nuget 包 LiteBus.Queries.Abstractions
dotnet add package LiteBus.Queries.Abstractions
实现 IQuery 接口,DTO 使用泛型
public record GetBlogPublishedPostsQuery<TDto>(int BlogId) : IQuery<TDto>;
Web 层安装 nuget 包 LiteBus.Queries.Extensions.Microsoft.DependencyInjection
dotnet add package LiteBus.Queries.Extensions.Microsoft.DependencyInjection
将 LiteBus 注册到依赖注入容器
services.AddLiteBus(liteBus =>
{
var appAssembly = typeof(GetBlogPublishedPostsQuery<BlogPostDto>).Assembly;
liteBus.AddQueryModule(module => module.RegisterFromAssembly(appAssembly));
});
在 Minimal API 中使用 IQueryMediator 发起查询并获取结果
app.MapGet(
""/blogs/{blogId:int}"",
async ([Required] int blogId, IQueryMediator mediator) =>
{
var posts = await mediator.QueryAsync(new GetBlogPublishedPostsQuery<BlogPostDto>(blogId));
return Results.Ok(posts);
});
Query 层 Query Handler 的实现代码
public class GetBlogPublishedPostsQueryHandler<TDto>(BlogDbContext dbContext)
: IQueryHandler<GetBlogPublishedPostsQuery<TDto>, IEnumerable<TDto>>
{
public async Task<IEnumerable<TDto>> HandleAsync(
GetBlogPublishedPostsQuery<TDto> query,
CancellationToken cancellationToken)
{
var posts = await dbContext.Set<BlogPost>()
.AsNoTracking()
.PublishedByBlogId(query.BlogId)
.OrderByDescending(p => p.DateAdded)
.ProjectToType<TDto>()
.ToListAsync(cancellationToken);
return posts;
}
}
浙公网安备 33010602011771号