Замена MediatR здесь



Пару месяцев назад выдал на Хабр статью о проблемах MediatR.

Если коротко, то это ненужное нагромождение абстракций для неявного распределения сообщений между обработчиками.



У библиотеки много изъянов, но осталось не понятно, как лаконично решить эту проблему распределения.

Сквозь статью красной нитью прошла мысль - явное лучше неявного. Причём по многим параметрам, таким как, например:



▪️Когнитивная сложность кода



▪️Поддерживаемость



▪️Тестируемость



▪️Отлаживаемость



Однако, при использовании явного подхода всплывает проблема избыточности кода. Входной узел может обрабатывать 10 разных сообщений, вследствие чего будет раздуваться конструктор из-за количества внедряемых зависимостей.



Сейчас идёт речь про контроллеры ASP NET Core, поскольку в основном применяется MediatR именно там. Решение было на поверхности - эксклюзивно делюсь им с вами.



FromServicesAttribute



И всё. Мы переходим на method injection, и сразу жизнь упрощается. Код такой же явный и декларативный, но гораздо короче.

В некоторых случаях можно даже не заводить интерфейсы, а регистрировать сразу concrete type.

Пример, как это выглядит:



[ApiController]

[Route("[controller]")]

public class SomeController

{

[HttpGet("data")]

public Task<GetSomeDataResponse> GetSomeData(

[FromQuery] GetSomeDataRequest request,

[FromServices] GetSomeDataRequestHandler handler,

CancellationToken token) =>

handler.HandleAsync(request, token);

}