ما هو MediatR ولماذا هو مطلوب؟
\n\nMediatR هي مكتبة خفيفة الوزن ولكنها قوية لـ .NET، تطبق نمط الوسيط (Mediator). في عالم تطوير البرمجيات، خاصة في التطبيقات المبنية على بنية CQRS (فصل مسؤولية الأوامر والاستعلامات)، أصبحت MediatR المعيار الفعلي.
\n\nلماذا هو مطلوب؟
\nفي البنية الكلاسيكية، عندما تريد فئة (مثل وحدة التحكم) تنفيذ إجراء في فئة أخرى (مثل خدمة)، يجب أن تعرف بوجود هذه الخدمة وواجهتها. هذا يخلق اقترانًا محكمًا (tight coupling). إذا أردت إضافة تسجيل أو تحقق أو تخزين مؤقت قبل استدعاء الخدمة، فسيتعين عليك تغيير كود وحدة التحكم أو إنشاء ديكوراتورات، مما يعقد الصيانة.
\n\nيحل MediatR هذه المشكلة من خلال تقديم مفهوم الوسيط. لم تعد مكونات النظام (مثل وحدات التحكم) تتواصل مباشرة. بدلاً من ذلك، ترسل طلبات (Request) أو أوامر (Command) عبر MediatR. المكتبة تجد وتستدعي المعالج (Handler) المناسب بنفسها.
\n\nالمزايا الرئيسية لاستخدام MediatR:
\n- \n
- اقتران ضعيف (Loose Coupling): مرسل الطلب لا يعرف شيئًا عن المستلم. يعرف فقط نوع الطلب. \n
- مبدأ المسؤولية الواحدة (SRP): كل معالج مسؤول عن إجراء واحد فقط (مثل "إنشاء مستخدم"، "الحصول على قائمة الطلبات"). \n
- تبسيط CQRS: MediatR مثالي لفصل الأوامر (التي تغير الحالة) والاستعلامات (التي تقرأ الحالة). \n
- سلاسل السلوك (Pipeline Behaviors): يمكنك بسهولة إضافة وظائف شاملة (تسجيل، تحقق، معاملات) دون تغيير كود المعالجات. \n
- قابلية الاختبار: من السهل اختبار المعالجات بشكل منفصل، وكذلك استبدال تنفيذها بسهولة. \n
تثبيت MediatR
\nيتم توزيع MediatR عبر NuGet. يمكن تثبيته بعدة طرق:
\n\n1. عبر .NET CLI (الطريقة الموصى بها)
\nافتح الطرفية في جذر مشروعك ونفذ الأمر:
\ndotnet add package MediatR\nستحتاج أيضًا إلى حزمة لحقن التبعيات (DI) إذا كنت تستخدم ASP.NET Core:
\ndotnet add package MediatR.Extensions.Microsoft.DependencyInjection\n\n2. عبر Package Manager Console (Visual Studio)
\nInstall-Package MediatR\nInstall-Package MediatR.Extensions.Microsoft.DependencyInjection\n\n3. عبر واجهة NuGet Package Manager UI
\nفي Visual Studio: Tools → NuGet Package Manager → Manage NuGet Packages for Solution.... ابحث عن "MediatR" وقم بتثبيت كلتا الحزمتين.
\n\nبداية سريعة مع مثال كود
\nلنقم بإنشاء مثال بسيط: إرسال تحية لمستخدم.
\n\nالخطوة 1: إنشاء مشروع
\nأنشئ مشروعًا جديدًا لوحدة التحكم أو مشروع ASP.NET Core Web API.
\n\nالخطوة 2: تعريف الطلب (Request)
\nأنشئ فئة تمثل الطلب. يجب أن تنفذ الواجهة IRequest<TResponse>، حيث TResponse هو نوع القيمة المرتجعة.
using MediatR;\n\npublic class PingRequest : IRequest<string>\n{\n public string Message { get; set; } = "Ping";\n}\n\nالخطوة 3: إنشاء المعالج (Handler)
\nأنشئ فئة تنفذ الواجهة IRequestHandler<TRequest, TResponse>.
using MediatR;\nusing System.Threading;\nusing System.Threading.Tasks;\n\npublic class PingHandler : IRequestHandler<PingRequest, string>\n{\n public Task<string