CQRS 和命令 Java + Spring 类似于 MediatR

jkr*_*z55 6 java spring cqrs

在处理 .NET 项目时,我遇到了一个库 MediatR,它使 CQRS 和命令易于实现。我真的很喜欢使用命令和命令处理程序,因为我从事过太多项目,这些项目具有巨大的过程式服务类,这些服务类向许多依赖项注入方式,使单元测试变得痛苦。我正在为 Spring + Java 寻找类似于 MediatR 的东西。本质上,我想将单个依赖项注入控制器类,并让它将命令委托给适当的命令处理程序。我在下面提供了一些 MediatR 外观的片段。我更喜欢中介者的方式,因为将 CommandHandlers 注入控制器类可能会导致与注入大量依赖项的类相同的问题。

我遇到过这个库,但它似乎更像是一个已经准备好生产的副项目。https://github.com/sleroy/spring-cqrs-arch。我知道 Axon 框架,但此时我不打算进行全面的事件溯源。是否有任何图书馆已经为此提供了可能我还没有偶然发现的图书馆?我想我可以只使用 Guava EventBus。

下面是 MediatR 用法的 C# 示例。

控制器

namespace DAB.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class PersonController : ControllerBase
    {
        private readonly IMediator mediator;

        public PersonController(IMediator mediator)
        {
            this.mediator = mediator;
        }

        // GET api/values
        [HttpPut("{id}/changename")]
        public async Task<ActionResult> ChangeName([FromBody] ChangeNameCommand command)
        {
            await this.mediator.Send(command);
            return Ok();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

命令

public class ChangeNameCommand: IRequest<bool>
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

命令处理器

public class ChangeNameHandler: IRequestHandler<ChangeNameCommand, bool>
{
    public Task<bool> Handle(ChangeNameCommand request, CancellationToken cancellationToken)
    {
        Console.WriteLine($"Changing name to {request.FirstName} {request.LastName}");
        return Task.FromResult(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 10

查看PipelinR。它是 15KB 的零依赖库,具有很好的 Spring 和 Spring Boot 集成。


kmh*_*oka 1

如果您仍在寻找类似的库,我制作了一个与mhinze/ShortBus类似的库。您可以在https://github.com/kazupooot/shortbus上查看。目前它支持单个处理程序请求/响应消息。