0Pricing
C# Academy · درس

مفاهيم CQRS

افصلوا الأوامر عن الاستعلامات لتحسين الوضوح

مفاهيم CQRS درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.

ما هو CQRS؟

يرمز CQRS إلى فصل مسؤولية الأوامر والاستعلامات. والفكرة بسيطة: افصل الشيفرة التي تغيّر الحالة (الأوامر) عن الشيفرة التي تقرأ الحالة (الاستعلامات).

// Commands : change state, return little or nothing
// Queries  : return data, change nothing

الأوامر

يعبّر الأمر عن نية لتغيير النظام، مثل إنشاء طلب أو إلغاء اشتراك. ويُسمّى عادةً بصيغة الأمر، وغالبًا ما يُرجع معرّفًا فقط أو لا يُرجع شيئًا.

public record CreateOrderCommand(int CustomerId, string[] Items);
public record CancelOrderCommand(int OrderId);

الاستعلامات

يطلب الاستعلام بيانات دون تأثيرات جانبية. ويُسمّى بحسب البيانات التي يُرجعها، ويحمل أي معلمات للتصفية.

public record GetOrderByIdQuery(int OrderId);
public record ListOrdersQuery(int CustomerId, int Page);

لماذا نفصل بينهما؟

للقراءات والكتابات احتياجات مختلفة:

  • تحتاج القراءات إلى السرعة، وإلغاء التطبيع، والملاءمة للتخزين المؤقت.
  • تحتاج الكتابات إلى التحقق وقواعد العمل والاتساق.

يتيح فصلهما تطوير كل جانب وتوسّعه بشكل مستقل.

// Read side  -> optimized projections / DTOs
// Write side -> domain rules / transactions

نمط المعالج

يعالج معالج مخصص كل أمر أو استعلام. رسالة واحدة، ومعالج واحد، ومسؤولية واحدة، مما يحافظ على صغر الفئات وتركيزها.

// CreateOrderCommand  -> CreateOrderHandler
// GetOrderByIdQuery    -> GetOrderByIdHandler

وحدات تحكم رشيقة

مع CQRS، تصبح وحدات التحكم رشيقة. فهي تنشئ رسالة وتوزّعها، بينما توجد كل المنطق في المعالج. ويزيل ذلك وحدات التحكم المتضخمة ويحسّن قابلية الاختبار.

[HttpPost]
public async Task<IActionResult> Create(CreateOrderCommand cmd)
{
    var id = await _sender.Send(cmd);
    return CreatedAtAction(nameof(Get), new { id }, null);
}

CQRS ليس تخزين الأحداث

من الأخطاء الشائعة الخلط بينهما: يقتصر CQRS على فصل القراءة عن الكتابة. أما تخزين الأحداث (تخزين الحالة كسجل من الأحداث) فهو نمط منفصل يتوافق جيدًا مع CQRS، لكنه ليس مطلوبًا.

// You can do CQRS with a plain single database.

مخزن بيانات واحد أم مخازن منفصلة

يستخدم CQRS الأساسي قاعدة بيانات واحدة لكلا الجانبين. أما الإعدادات المتقدمة فتستخدم مخزني قراءة وكتابة منفصلين تتم مزامنتهما، مع قبول الاتساق النهائي لتحقيق قابلية التوسع. ابدأ بالحل البسيط.

// Level 1: one DB, separate handlers (most apps)
// Level 2: separate read/write models
// Level 3: separate read/write databases

الفوائد

يوفّر لك CQRS ما يلي:

  • معالجات واضحة مخصصة لغرض واحد.
  • اختبارًا أسهل، إذ يُختبر كل معالج بمعزل عن الآخرين.
  • مكانًا طبيعيًا للاهتمامات المشتركة بين الجوانب، مثل التحقق والتسجيل.
  • إمكانية توسيع نطاق القراءات والكتابات بشكل مستقل.
// One class per use case = easy to find and test

التكاليف

يضيف CQRS مزيدًا من الفئات وطبقات الوساطة. وقد يكون مبالغًا فيه لتطبيق CRUD بسيط. طبّقه عندما تكون منطق الأعمال غنيًا أو المجال معقدًا.

// Trade-off: clarity & scale vs. boilerplate

استخدام MediatR

تطبّق مكتبة MediatR نمط الوسيط داخل العملية، إذ توزّع كل رسالة إلى معالجها، فلا تضطر إلى ربطها يدويًا. ويستخدم هذا المقرر المكتبة في بقية أجزائه.

dotnet add package MediatR

تحقق سريع

تأكّد من التمييز الأساسي.

مراجعة

لقد تعلّمت مفاهيم CQRS:

  • افصل الأوامر (تغييرات الحالة) عن الاستعلامات (القراءات).
  • لكل رسالة معالج واحد مخصص، مما يحافظ على رشاقة وحدات التحكم.
  • يعمل CQRS بشكل مستقل عن تخزين الأحداث، ويمكنه استخدام قاعدة بيانات واحدة.
  • توزّع MediatR الرسائل إلى المعالجات.

التالي: الأوامر والمعالجات باستخدام MediatR.

الأسئلة الشائعة

هل درس «مفاهيم CQRS» مجاني؟

نعم — نص درس «مفاهيم CQRS» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.

ماذا ستتعلم في «مفاهيم CQRS»؟

افصلوا الأوامر عن الاستعلامات لتحسين الوضوح تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟

لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «مفاهيم CQRS»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟

نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مفاهيم CQRS
  2. الأوامر والمعالجات باستخدام MediatR
  3. سلوكيات مسار المعالجة
  4. الإشعارات والأحداث
← العودة إلى C# Academy