الأوامر والمعالجات باستخدام MediatR
وجّهوا الطلبات إلى معالجات مخصّصة
الأوامر والمعالجات باستخدام MediatR درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
تسجيل MediatR
يفحص MediatR التجميعات لاكتشاف المعالجات. سجّله مرة واحدة عند بدء التشغيل، مع توجيهه إلى تجميعة تحتوي على المعالجات.
builder.Services.AddMediatR(cfg =>
cfg.RegisterServicesFromAssembly(typeof(Program).Assembly));IRequest
تطبّق الرسالة التي تتوقع استجابة IRequest<TResponse>. ويحدد نوع المعلمة ما يُرجعه المعالج.
public record CreateOrderCommand(int CustomerId, string[] Items)
: IRequest<int>; // returns the new order idالأوامر دون نتيجة
إذا لم يُرجع الأمر شيئًا ذا معنى، فطبّق IRequest غير العامة (وهي اختصار لـ IRequest<Unit>).
public record CancelOrderCommand(int OrderId) : IRequest;IRequestHandler
يطبّق المعالج IRequestHandler<TRequest, TResponse> ويوفّر الأسلوب Handle الذي يُنفّذ فيه العمل.
public class CreateOrderHandler
: IRequestHandler<CreateOrderCommand, int>
{
public Task<int> Handle(
CreateOrderCommand request, CancellationToken ct)
{
// create the order...
return Task.FromResult(newOrderId);
}
}حقن التبعيات
يُحلّ المعالج من خلال DI، ولذلك يمكنه تلقّي سياق قاعدة بيانات أو مستودعات أو خدمات أخرى عبر الباني.
public class CreateOrderHandler(AppDbContext db)
: IRequestHandler<CreateOrderCommand, int>
{
public async Task<int> Handle(
CreateOrderCommand request, CancellationToken ct)
{
var order = new Order { CustomerId = request.CustomerId };
db.Orders.Add(order);
await db.SaveChangesAsync(ct);
return order.Id;
}
}ISender
لتوزيع طلب، احقن ISender (أو IMediator الأوسع نطاقًا) واستدعِ Send. وسيعثر MediatR على المعالج المطابق.
public class OrdersController(ISender sender) : ControllerBase
{
[HttpPost]
public async Task<IActionResult> Create(CreateOrderCommand cmd)
{
int id = await sender.Send(cmd);
return CreatedAtAction(nameof(Get), new { id }, null);
}
}استدعاء Send في Minimal APIs
تحقن Minimal APIs ISender مباشرةً في مفوّض نقطة النهاية.
app.MapPost("/orders", async (
CreateOrderCommand cmd, ISender sender) =>
{
var id = await sender.Send(cmd);
return Results.Created($"/orders/{id}", new { id });
});الاستعلامات مجرد طلبات
تستخدم الاستعلامات الآلية نفسها التي تستخدمها IRequest وIRequestHandler؛ والاختلاف الوحيد هو النية: يقرأ المعالج ولا يغيّر الحالة مطلقًا.
public record GetOrderQuery(int Id) : IRequest<OrderDto?>;
public class GetOrderHandler(AppDbContext db)
: IRequestHandler<GetOrderQuery, OrderDto?>
{
public async Task<OrderDto?> Handle(
GetOrderQuery q, CancellationToken ct) =>
await db.Orders
.Where(o => o.Id == q.Id)
.Select(o => new OrderDto(o.Id, o.Total))
.SingleOrDefaultAsync(ct);
}معالج واحد لكل طلب
بالنسبة إلى Send، يجب أن يطابق الطلب نوع معالج واحد تمامًا. ويُعد تسجيل صفر معالجات أو معالجين للطلب نفسه خطأً في الإعداد.
// CreateOrderCommand -> exactly one CreateOrderHandlerإرجاع نتائج غنية
يمكن أن تكون الاستجابة من أي نوع: DTO أو غلاف نتيجة أو حتى نتيجة متعددة الحالات، مما يتيح للمعالجات التعبير صراحةً عن النجاح والفشل.
public record Result(bool Ok, string? Error);
public record PlaceOrderCommand(int Id) : IRequest<Result>;اختبار معالج
لأن المعالج فئة عادية ذات تبعيات محقونة، يمكنك اختباره مباشرةً، دون HTTP أو الحاجة إلى وحدة تحكم.
var handler = new CreateOrderHandler(inMemoryDb);
var id = await handler.Handle(
new CreateOrderCommand(1, ["sku-1"]), CancellationToken.None);
Assert.True(id > 0);تحقق سريع
تأكّد من نموذج توزيع MediatR.
مراجعة
لقد نفّذت الأوامر والمعالجات:
- يفحص
AddMediatRالتجميعات لتسجيل المعالجات. - تطبّق الرسائل
IRequest<T>، بينما تطبّق المعالجاتIRequestHandler<TRequest, T>. - احقن
ISenderواستدعِSendلتوزيع الطلب؛ إذ يطابقه معالج واحد بالضبط. - تعيد الاستعلامات استخدام الآلية نفسها وتبقى خالية من التأثيرات الجانبية.
التالي: سلوكيات مسار المعالجة.
تعلم C# مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 93
- الدروس
- 346
الأسئلة الشائعة
هل درس «الأوامر والمعالجات باستخدام MediatR» مجاني؟
نعم — نص درس «الأوامر والمعالجات باستخدام MediatR» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «الأوامر والمعالجات باستخدام MediatR»؟
وجّهوا الطلبات إلى معالجات مخصّصة تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «الأوامر والمعالجات باستخدام MediatR»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مفاهيم CQRS
- الأوامر والمعالجات باستخدام MediatR
- سلوكيات مسار المعالجة
- الإشعارات والأحداث