В современной разработке приложений всё чаще возникает задача decoupled (развязанной) коммуникации между компонентами. Одним из самых популярных решений для этой цели в экосистеме .NET является библиотека MediatR. В этой статье мы покажем, как, используя MediatR, можно «написать колдуну бесплатно» – то есть реализовать простой, надёжный и безвозмездный механизм обмена сообщениями между слоями приложения, напоминающий отправку послания волшебнику.
Что такое MediatR?
MediatR – это лёгкая реализация паттерна Mediator (посредник) для .NET. Она позволяет:
- разделять отправителя и получателя сообщения;
- избавляться от прямых ссылок между классами;
- централизовать обработку запросов и команд;
- легко расширять функциональность через обработчики (handlers).
Благодаря этим свойствам MediatR часто используется в рамках подходов CQRS и Clean Architecture, но её можно применить и в более простых сценариях – например, для отправки «запроса» к воображаемому колдуну.
Почему бесплатно?
Библиотека MediatR распространяется под лицензией MIT, то есть её можно использовать в коммерческих и некоммерческих проектах без каких-либо платежей. Все необходимые пакеты доступны через NuGet:
dotnet add package MediatR
dotnet add package MediatR.Extensions.Microsoft.DependencyInjection
Таким образом, стоимость внедрения – только время разработчика.
Архитектура «написания колдуну»
Представим, что у нас есть:
- Запрос (Request) – послание, которое мы хотим отправить колдуну.
- Обработчик (Handler) – сам колдун, который получает послание и возвращает ответ (например, пророчество или заклинание).
- Медиатор – инфраструктура, которая доставляет послание от отправителя к колдуну.
Эта схема полностью соответствует работе MediatR.
Определение запроса
Создадим класс, представляющий наше послание:
using MediatR;
public class WizardMessage : IRequest<string>
{
public string Text { get; set; }
public WizardMessage(string text)
{
Text = text;
}}
Здесь IRequest<string> указывает, что обработчик вернёт строку – ответ колдуна.
Реализация обработчика (колдуна)
Теперь напишем класс, который будет обрабатывать послание:
using MediatR;
using System.Threading;
using System.Threading.Tasks;
public class WizardHandler : IRequestHandler<WizardMessage, string>
{
public Task<string> Handle(WizardMessage request, CancellationToken cancellationToken)
{
// Здесь может быть любая логика: анализ текста, генерация ответа и т.д.
string answer = $"Колдун получил ваше послание: "{request.Text}". Его ответ: «Пусть звёзды направят ваш путь!»";
return Task.FromResult(answer);
}
} Обработчик реализует IRequestHandler<WizardMessage, string>, что гарантирует его вызов Mediator’ом при получении сообщения типа WizardMessage.
Регистрация MediatR в DI-контейнере
В ASP.NET Core (или любом другом .NET‑приложении) достаточно добавить одну строку в Startup.cs или Program.cs:
using MediatR;
using Microsoft.Extensions.DependencyInjection;
var builder = WebApplication.CreateBuilder(args);
// Регистрация MediatR и всех обработчиков из текущей сборки
builder.Services.AddMediatR(typeof(WizardHandler).Assembly);
var app = builder.Build;
app.Run;
После этого MediatR готов к работе, и мы можем «написать колдуну» из любого места приложения.
Пример использования
Допустим, мы хотим отправить послание из контроллера:
using Microsoft.AspNetCore.Mvc;
using MediatR;
[ApiController]
[Route("[controller]")]
public class WizardController : ControllerBase
{
private readonly IMediator _mediator;
public WizardController(IMediator mediator)
{
_mediator = mediator;
}
[HttpPost]
public async Task<ActionResult<string>> SendMessage([FromBody] WizardMessage request)
{
string answer = await _mediator.Send(request);
return Ok(answer);
}
}
Отправляя POST‑запрос с телом { "text": "Привет, колдун!" }, мы получим ответ от нашего волшебного обработчика.
Лучшие практики при работе с MediatR
- Держите запросы и обработчики узкоспециализированными; Каждый запрос должен решать одну чёткую задачу – так легче тестировать и поддерживать код.
- Избегайте бизнес‑логики в обработчиках. Если логика сложная, вынесите её в отдельные сервисы или доменные сервисы, а обработчик лишь orchestrate их вызов.
- Используйте медиатор только для межслойной коммуникации. Внутри одного слоя (например, внутри сервиса) обычные вызовы методов предпочтительнее.
- Настраивайте pipeline‑поведения (behaviors). MediatR позволяет добавить пред‑ и пост‑обработку (логирование, валидация, кэширование) через
IPipelineBehavior<TRequest, TResponse>.
Используя MediatR, мы получаем простой и бесплатный способ организовать «послание» к любому компоненту системы – будь то реальный сервис, внешний API или воображаемый колдун. Благодаря чистому разделению ответственности, минимальным зависимостям и поддержке DI, MediatR становится идеальным инструментом для построения надёжных и легко расширяемых приложений.
Так что смело пишите своему колдуну бесплатно – MediatR доставит ваше сообщение точно и без лишних затрат!