初试 .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;
    }
}
posted @ 2026-02-22 13:17  dudu  阅读(56)  评论(0)    收藏  举报