Замена MediatR здесь
Пару месяцев назад выдал на Хабр статью о проблемах MediatR.
Если коротко, то это ненужное нагромождение абстракций для неявного распределения сообщений между обработчиками.
У библиотеки много изъянов, но осталось не понятно, как лаконично решить эту проблему распределения.
Сквозь статью красной нитью прошла мысль - явное лучше неявного. Причём по многим параметрам, таким как, например:
▪️Когнитивная сложность кода
▪️Поддерживаемость
▪️Тестируемость
▪️Отлаживаемость
Однако, при использовании явного подхода всплывает проблема избыточности кода. Входной узел может обрабатывать 10 разных сообщений, вследствие чего будет раздуваться конструктор из-за количества внедряемых зависимостей.
Сейчас идёт речь про контроллеры ASP NET Core, поскольку в основном применяется MediatR именно там. Решение было на поверхности - эксклюзивно делюсь им с вами.
И всё. Мы переходим на method injection, и сразу жизнь упрощается. Код такой же явный и декларативный, но гораздо короче.
В некоторых случаях можно даже не заводить интерфейсы, а регистрировать сразу concrete type.
Пример, как это выглядит:
Пару месяцев назад выдал на Хабр статью о проблемах 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);
}