Работая над проектом .NET, я натолкнулся на библиотеку MediatR, которая сделала CQRS и Команды простыми в реализации.Мне действительно нравится использовать команды и обработчики команд, так как я работал над слишком многими проектами, которые имеют гигантские классы процедурных процедурных стилей, которые внедряют множество зависимостей, делая модульное тестирование болезненным.Я ищу что-то похожее на MediatR для Spring + Java.По сути, я хотел бы добавить одну зависимость в класс контроллера и передать ему команды в соответствующий обработчик команд.Я предоставил несколько фрагментов того, как MediatR выглядит ниже.Я предпочитаю способ, которым посредник делает это, так как внедрение CommandHandlers в класс контроллера может привести к той же самой проблеме с классом, имеющим множество зависимостей.
Я сталкивался с этой библиотекой, но это больше похоже на сторонупроект, что-то, что готово к производству.https://github.com/sleroy/spring-cqrs-arch. Я знаю об инфраструктуре Axon, но я не собираюсь использовать полноценный источник событий на этом этапе.Есть ли какие-нибудь библиотеки для этого, с которыми я еще не сталкивался?Я полагаю, я мог бы просто использовать Guava EventBus.
Ниже приведен пример C # того, как выглядит использование MediatR.
Контроллер
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();
}
}
}
Команда
public class ChangeNameCommand: IRequest<bool>
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
CommandHandler
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);
}
}