Как написать колдуну бесплатно с помощью MediatR

Развяжите компоненты с MediatR: простой, надежный и бесплатный способ общения слоёв, словно вы пишете колдуну — чистая магия архитектуры!

В современной разработке приложений всё чаще возникает задача 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

Таким образом, стоимость внедрения – только время разработчика.

Архитектура «написания колдуну»

Представим, что у нас есть:

  1. Запрос (Request) – послание, которое мы хотим отправить колдуну.
  2. Обработчик (Handler) – сам колдун, который получает послание и возвращает ответ (например, пророчество или заклинание).
  3. Медиатор – инфраструктура, которая доставляет послание от отправителя к колдуну.

Эта схема полностью соответствует работе 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 доставит ваше сообщение точно и без лишних затрат!