CodeShot
MediatR1 دقیقه مطالعه

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 غیرضروری است.

این مطلب مفید بود؟
نشان کردن
مشاهده در Concept Hub ←