在处理 .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)
如果您仍在寻找类似的库,我制作了一个与mhinze/ShortBus类似的库。您可以在https://github.com/kazupooot/shortbus上查看。目前它支持单个处理程序请求/响应消息。
| 归档时间: |
|
| 查看次数: |
2912 次 |
| 最近记录: |