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٪این مطلب مفید بود؟
☆نشان کردن