MediatR چیست؟
کتابخانهای سبک برای پیادهسازی الگوی Mediator در .NET که Requestها (Command/Query) را بدون وابستگی مستقیم بین فرستنده و پردازشکننده رد و بدل میکند.
چرا مهم است؟
بهجای اینکه Controller مستقیماً چند Service مختلف را تزریق و صدا بزند، فقط IMediator را تزریق میکند؛ این کار Controller را سبک نگه میدارد و منطق هر عملیات را در یک Handler مجزا و قابل تست جدا میکند.
اجزای اصلی
public record GetOrderByIdQuery(Guid Id) : IRequest<OrderDto>;
public class GetOrderByIdHandler : IRequestHandler<GetOrderByIdQuery, OrderDto>
{
public Task<OrderDto> Handle(GetOrderByIdQuery request, CancellationToken ct)
{
// منطق واکشی سفارش
return Task.FromResult(new OrderDto());
}
}
استفاده در Controller
public class OrdersController : ControllerBase
{
private readonly IMediator _mediator;
public OrdersController(IMediator mediator) => _mediator = mediator;
[HttpGet("{id}")]
public async Task<OrderDto> Get(Guid id) => await _mediator.Send(new GetOrderByIdQuery(id));
}
ثبت در DI
builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(typeof(Program).Assembly));
نکات مهم
- هر Request دقیقاً یک Handler دارد؛ این ارتباط یکبهیک باعث میشود کد هر Use Case مستقل و قابل تست جدا باشد — پایه معمول Vertical Slice Architecture و CQRS.
- Pipeline Behaviors اجازه میدهند منطق مشترک (Logging، Validation با FluentValidation، تراکنش) بدون تکرار در هر Handler، دور همه Requestها بپیچد.
اشتباه رایج
❌ استفاده از MediatR برای فراخوانی درونفرایندی خیلی ساده (مثل صدازدن یک متد Helper) — این کار فقط یک لایه Indirection و Overhead غیرضروری اضافه میکند، بدون هیچ مزیت واقعی.
خلاصه
MediatR الگوی Mediator را در .NET پیاده میکند: هر Command/Query یک Request است که دقیقاً یک Handler آن را پردازش میکند، بدون وابستگی مستقیم فرستنده به پردازشکننده. Pipeline Behaviors امکان افزودن Logging/Validation مشترک بدون تکرار کد را میدهند. برای فراخوانیهای خیلی ساده معمولاً Overhead غیرضروری است.
