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

CQRS و MediatR چیست؟

CQRS مسیر خواندن و نوشتن داده را از هم جدا می‌کند؛ MediatR ابزار رایج پیاده‌سازی آن در .NET است.

چرا مهم است؟

در آگهی‌های Senior/Lead .NET (مخصوصاً همراه Clean Architecture) بسیار رایج است.

ایدهٔ اصلی CQRS

به‌جای یک سرویس با متدهای Get/Create/Update/Delete، هر عملیات به دو دستهٔ جدا تقسیم می‌شود:

  • Command: تغییر حالت (Create/Update/Delete) — معمولاً بدون خروجی، یا فقط شناسه/نتیجه.
  • Query: فقط خواندن داده — بدون تغییر حالت.

پیاده‌سازی با MediatR

public record CreateOrderCommand(int CustomerId) : IRequest<int>;

public class CreateOrderHandler : IRequestHandler<CreateOrderCommand, int>
{
    public async Task<int> Handle(CreateOrderCommand request, CancellationToken ct)
    {
        var order = new Order(request.CustomerId);
        await _repository.AddAsync(order);
        return order.Id;
    }
}

// در Controller:
var orderId = await _mediator.Send(new CreateOrderCommand(customerId));

چرا این جداسازی مفید است

  • Query می‌تواند مستقیم به Dapper/SQL خام برود (سریع‌تر) بدون عبور از قواعد پیچیدهٔ Domain.
  • Command از Domain Entity و اعتبارسنجی کسب‌وکار عبور می‌کند.
  • Controllerها باریک و تمیز می‌مانند چون فقط یک Send/Publish صدا می‌زنند.

اشتباه رایج

❌ فرض کردن CQRS همیشه یعنی دیتابیس/مدل جدا برای Read و Write (Event Sourcing کامل) — پیچیدگی افراطی برای اکثر پروژه‌ها. ✅ در اکثر پروژه‌ها همان یک دیتابیس کافی است؛ فقط مسیر کد Command/Query را جدا کنید.

خلاصه

CQRS مسیر خواندن و نوشتن را جدا می‌کند؛ MediatR این جداسازی را با الگوی Mediator در .NET پیاده‌سازی می‌کند؛ نسخهٔ سبک CQRS (بدون دیتابیس جدا) برای اکثر پروژه‌ها کافی است.

حالا امتحان کن

🧩آزمون CQRS و MediatR3 سؤال · نمره قبولی 60٪
این مطلب مفید بود؟
نشان کردن
مشاهده در Concept Hub ←