استخدم نمط CQRS بعناية ويمكنك إنشاء تطبيقات Nest أكثر نظافة وقابلية للتوسع.
يتمثل أحد الأساليب الشائعة لتطوير NestJS في بناء خدمات يتواصل معها المتحكمون للوصول إلى البيانات. لكن هذا النهج ليس نمط التصميم الوحيد الصالح في NestJS. هناك أنماط تصميم أخرى ، مثل نمط تصميم CQRS.
CQRS هو نمط تصميم يفصل بين عمليات القراءة والكتابة للتطبيق. يمكن أن يساعد هذا الفصل في تحسين قابلية التوسع والأداء وقابلية الصيانة.
اكتشف كل شيء عن CQRS وكيف يمكنك تطبيقه عند إنشاء واجهة برمجة تطبيقات NestJS.
ما هو CQRS؟
CQRS تمثل الفصل بين مسؤولية الأوامر والاستعلام. ينفذ استخدام أوامر لإنشاء وتحديث وحذف البيانات و استفسارات لجلب البيانات. يساعد هذا في التخلص من الحاجة إلى تنفيذ استدعاءات قاعدة بيانات التطبيق في الخدمات.
كما أنه يمكّن من التمييز الواضح بين منطق الاستعلام عن البيانات في قاعدة البيانات وتنفيذ الإجراءات الأخرى في التطبيق.
نهج CQRS مفيد في تصميم يحركه المجال، والذي يسمح لك بالفصل بين منطق المجال وعمليات البنية التحتية في تطبيقك. يمكنك أيضًا استخدامه لتنفيذ منطق الأعمال المعقد ، ولكن لا يوصى بذلك للتطبيقات الأبسط.
استخدام CQRS في واجهة برمجة تطبيقات NestJS
يمكنك استخدام نمط تصميم CQRS في واجهة برمجة التطبيقات التي تقوم بإنشائها في NestJS. للمتابعة ، يجب أن يكون لديك Node.js مثبت على جهاز الكمبيوتر الخاص بك وإصدار حديث من NestJS.
استخدم الخطوات التالية لإنشاء تطبيق مدونة بسيط يقوم بتنفيذ نمط تصميم CQRS.
أنشئ مشروع Nest
قم بإنشاء مشروع Nest جديد وأنشئ ملف بريد مورد لتطبيق مدونة. يمكنك القيام بذلك عن طريق تشغيل الأوامر التالية في المحطة:
عش جديد nestjs-cqrs
nest g وحدة المشاركات
عش وحدة تحكم g
nest g خدمة الوظائف
تثبيت التبعيات
بعد الانتهاء من الخطوات المذكورة أعلاه ، قم بتشغيل هذا الأمر الطرفي لتثبيت حزمة NestJS CQRS:
تثبيت npm - حفظ @ nestjs / cqrs
إنشاء خدمة بريد
أضف الكود التالي إلى ملف post.service.ts ملف لتعريف ملف خدمة آخر فصل.
// posts.service.ts
يستورد {قابل للحقن} من"@ nestjs / مشترك";يصدّرواجهه المستخدم بريد {
عنوان: خيط;
محتوى: خيط;
}تضمين التغريدة()
يصدّرفصل خدمة آخر {
خاص المشاركات للقراءة فقط: النشر [] = []؛إنشاء (نشر: نشر): نشر {
هذا.posts.push (نشر) ؛
يعود بريد؛
}
findById (المعرف: رقم): بريد {
يعودهذا.posts.find (بريد => معرف post) ؛
}
}
ال خدمة آخر يحدد يخلق و findById طرق لإنشاء منشور جديد والحصول على منشور موجود من معرفه.
تحديد الأوامر والاستعلامات
الخطوة التالية هي تحديد الاستعلامات والأوامر الأساسية لنمط تصميم CQRS.
في ال دعامات الدليل ، قم بإنشاء ملفين جديدين: خلق P.ostCommand.command.ts و getPostQuery.query.ts. يجب أن يبدو ملف الأوامر كما يلي:
// createPostCommand.command.ts
يصدّرفصل CreatePostCommand {
البناء(عام عنوان للقراءة فقط: خيط, عام محتوى للقراءة فقط: خيط) {}
}
وملف تعريف الاستعلام مثل هذا:
// getPostQuery.query.ts
يصدّرفصل GetPostQuery {
البناء(عام معرّف للقراءة فقط: رقم) {}
}
إنشاء معالجات الأوامر والاستعلام
بعد تحديد أوامرك واستعلاماتك بنجاح ، تحتاج إلى إنشاء معالجات لها. المعالج هو دالة تقوم بتشغيل أمر أو استعلام وإرجاع النتيجة.
إنشاء handlers.ts ملف في الخاص بك بريد الدليل والصق الكود التالي فيه:
// handlers.ts
يستورد {CommandHandler، ICommandHandler} من"@ nestjs / cqrs";
يستورد {CreatePostCommand} من"./createPostCommand.command.ts";
يستورد { خدمة آخر } من'./خدمة آخر';تضمين التغريدة(CreatePostCommand)
يصدّرفصل CreatePostHandler الأدوات ICommandHandler{
البناء(خاص للقراءة فقط postService: PostService) {}
غير متزامن تنفيذ (الأمر: CreatePostCommand) {
مقدار ثابت {الاسم ، السعر} = الأمر ؛
مقدار ثابت آخر = انتظرهذا.postService.create (العنوان والمحتوى) ؛
يعود بريد؛
}
}
في نفس handlers.ts ملف ، يمكنك تعديل عبارات الاستيراد لتضمين العبارات أدناه ، للسماح بالعمل مع الاستعلامات. يمكنك بعد ذلك تطبيق معالج الاستعلام كما هو موضح في الكود أدناه:
// handler.ts
يستورد {QueryHandler ، IQueryHandler} من"@ nestjs / cqrs";
يستورد {GetPostQuery} من"./getPostQuery.query";
يستورد { خدمة آخر } من'./خدمة آخر';// معالج الاستعلام
تضمين التغريدة(GetProductQuery)
يصدّرفصل GetPostHandler الأدوات IQueryHandler{
البناء(خاص للقراءة فقط postService: PostService) {}
غير متزامن تنفيذ (الاستعلام: GetPostQuery) {
مقدار ثابت {معرف} = استعلام ؛
مقدار ثابت آخر = انتظرهذا.postService.findOneById (id) ،
يعود بريد؛
}
}
معالجات التسجيل
الخطوة الأخيرة هي تسجيل معالجات الأوامر والاستعلامات مع وحدة NestJS.
// post.module.ts
يستورد { وحدة } من"@ nestjs / مشترك";
يستورد {CommandHandlers ، QueryHandlers} من"handlers.ts";
يستورد { خدمة آخر } من'./خدمة آخر';
@وحدة({
الموفرون: [
خدمة آخر،
... القادة ،
... QueryHandlers ،
],
})
يصدّرفصل PostModule {}
يسجل هذا الرمز ملف خدمة آخر, القيادة، و معالجي الاستعلام في ال مقدمي مجموعة مصفوفة. استخدام عامل انتشار (...) هو دمج مصفوفات استفسار معالجات و يأمر معالجات في مقدمي مجموعة مصفوفة.
تنفيذ الأوامر والاستعلامات
الأوامر المسجلة ومعالجات الاستعلام قابلة للاستخدام في وحدات التحكم. الكود التالي هو تنفيذ أ دعامات الذي سيقبل طلبات HTTP ويعيد الاستجابات المطلوبة.
// posts.controller.ts
يستورد {Body، Controller، Post} من"@ nestjs / مشترك";
يستورد {CommandBus} من"@ nestjs / cqrs";
يستورد {CreatePostCommand} من"./createPostCommand.command.ts";// تحكم تنفذ الأمر
@مراقب('دعامات')
يصدّرفصل PostController {
البناء(خاص للقراءة فقط commandBus: CommandBus) {}
@بريد()
غير متزامن createPost (@جسم() النص الأساسي: {العنوان: خيط; محتوى: خيط }) {
مقدار ثابت {title، content} = body؛
مقدار ثابت الأمر = جديد CreatePostCommand (العنوان والمحتوى) ؛
مقدار ثابت آخر = انتظرهذا.commandBus.execute (أمر) ؛
يعود بريد؛
}
}
في الكود أعلاه ، كوماندبوس ينفذ CreatePostCommand وينشئ مشاركة جديدة.
يوضح هذا الرمز كيفية تنفيذ وحدة تحكم تستخدم استعلامًا:
// posts.controller.ts
يستورد {تحكم ، احصل ، معلمة} من"@ nestjs / مشترك";
يستورد {QueryBus} من"@ nestjs / cqrs";
يستورد {GetPostQuery} من"./getPostQuery.query";@مراقب('دعامات')
يصدّرفصل PostController {
البناء(خاص استعلام للقراءة فقط) {}
@يحصل(':بطاقة تعريف')
غير متزامن getPost (تضمين التغريدة('بطاقة تعريف') بطاقة تعريف: رقم) {
مقدار ثابت الاستعلام = جديد GetPostQuery (معرف) ،
مقدار ثابت آخر = انتظرهذا.queryBus.execute (استعلام) ؛
يعود بريد؛
}
}
ال الاستعلام ينفذ GetPostQuery الذي يحصل على المنشور بالمعرف المعطى ويعيده.
بعد الانتهاء من جميع الخطوات المذكورة أعلاه ، يجب أن يكون لديك الآن تطبيق بسيط وعملي لإنشاء منشورات المدونة وجلبها.
على الرغم من أن الشفرة هنا تستخدم مصفوفة لتخزين المنشورات التي تم إنشاؤها في الذاكرة ، فمن المرجح أن تستخدم قاعدة بيانات في الإنتاج. يمكنك إما استخدام ملف قاعدة بيانات SQL، أو أ قاعدة بيانات NoSQL مثل MongoDB، حيث يدعم NestJS كلا الخيارين.
بناء واجهات برمجة التطبيقات مع نمط تصميم CQRS
يمكن أن يساعد دمج نمط تصميم CQRS في تطبيق NestJS في قابلية التوسع والأداء وقابلية الصيانة. يسمح CQRS بعمليات أكثر كفاءة وأفضل من خلال فصل عمليات القراءة والكتابة التي ينفذها التطبيق.
توفر الحزمة @ nestjs / cqrs لبنة أساسية لتنفيذ CQRS في NestJS باستخدام الأوامر ومعالجات الاستعلام. بشكل عام ، يعد CQRS نمطًا قويًا يمكن أن يساعد في إنشاء تطبيقات أكثر كفاءة وقابلية للتطوير ، ويجب عليك موازنة خياراتك قبل استخدامه.