أهم أقسام المدونة

الصفحات

الثلاثاء، 2 أبريل 2019

Vazor 1.0


أخيرا بفضل الله، أنهيت الإصدار الأول من Vazor (VB.NET Razor):

أنشأت مستودعا جديدا للمشروع على GitHub لأني طبقت فكرة جديدة.. ففي المشروع السابق، أنشأت محرك عرض View Engine ليقوم بعرض الصفحات المكتوبة بكود vbxml.. لكني واجهت تحديات كبيرة، لأن الكود الناتج من vbxml ما زال يحتوي على بعض الأجزاء التي لا تصلح للعرض مباشرة في صفحات الويب مثل Tag Helpers وغيرها.. وقد حاولت الغوص في Razor لأرى كيف هذه الأدوات المساعدة، فاكتشفت أنه يقوم بإنتاج فئة سي شارب ويكتب فيها الكود اللازم لإنتاج صفحة HTML ثم يترجمها وينفذها!.. وهذا الأمر سيكون معقدا خاصة أننا نعمل من مشروع فيجوال بيزك، لهذا قررت أن أجد طريقة أخرى.

والحمد لله، وجدت تقنية مدهشة اسمها مزودات الملفات File Providers، تسمح لتطبيقات الويب بالحصول على الملفات من أي مصدر، سواء كان نظام الملفات File System على جهاز، أو مورد مدمج Imbedded Resource داخل ملف dll أو حتى قاعدة بيانات أو أي مصدر افتراضي آخر ليس ملفا أصلا!

وقد وجدث ضالتي في النقطة الأخيرة، حيث يمكنني أن أرسل النص الخاص بالصفحة إلى مزود الملفات الوهمي، ليتعامل معه كأنه ملف cshtml !

وهكذا أنشأت Vazor ليكون مزود ملفات تخيلي Virtual File Provider، مهمته تسليم الصفحات التي كتبناها بفيجوال بيزيك إلى Razor ليقوم هو بكل العمل المتبقي ويعرض الصفحات بالشكل الذي نتوقعه!

هنا بقيت مشكلة كان علي حلها، وهي كيف أميز بين الصفحات المختلفة الناتجة من نفس العرض؟

أنت تعلم أن فئة العرض تحتوي على بعض كود فيجوال بيزيك الذي سيضيف بعض قيم المتغيرات إلى كود Html لتكوين الصفحة المطلوبة.. على سبيل المثال، لو لدينا فئة عرض كل مهمتها أن تعرض الرسالة:

Hello <%= ViewBag.UserName %>

كل مستخدم ستفتح هذه الصفحة، سيرى هذه الرسالة متضمنة اسمه، مثل:

Hello Ahmed

المشكلة هنا أننا سنسلم الصفحة  Hello Ahmed إلى Razor.. ومع مستخدم آخر سنسلم الصفحة Hello Ali ومع مستخدم ثالث Hello Sara.... إلخ مع ملاحظة أن هؤلاء المستخدمين قد يدخلون إلى الموقع الخاص بنا معا في نفس اللحظة، وهذا معناه أن لدينا ثلاث نسخ مختلفة من فئة العرض وليس مجرد صفحة cshtml واحدة كما كان يحدث مع Razor.. ولكن في نظام الملفات التخيلي، سيرسل Razor إلينا ليطلب الصفحة Views\Inex.cshtml بينما لدينا هنا عدة صفحات منتجة جميعا من نفس فئة العرض!.. فكيف نحل هذا؟

لحل هذه المشكلة، أنشأت فئة تعمل كخريطة وأسميتها VazorViewMapper هي عبارة عن قاموس نخزن فيه الصفحات المطلوب عرضها، مع إضافة رقم متفرد في نهاية اسم كل صفحة مثل Index_ID_1 و Index_ID_2 و Index_ID_3 ... إلخ.. وفي فئة المتحكم Controller سنستخدم وسيلة الأداء Action Method لوضع الصفحة المطلوب عرضها في الخريطة باستخدام الوسيلة VazorViewMapper.Add التي ستعيد إلينا الاسم المتفرد الذي تم تكوينه.. هذا الاسم سنرسله إلى الوسيلة View الخاصة بالمتحكم فلحسن الحظ تمتلك هذه الوسيلة صيغة تستقبل اسم الصفحة المطلوب عرضها.. وهكذا نكون قد أرسلنا الاسم الجديد مثل Index_ID_1 إلى Razor ونظرا لأنه يستخدم نظام الملفات الوهمي الخاص بنا، فسيطلب منه البحث عن هذه الصفحة في المسارات المختلفة المتعارف عليها في تقنية Razor وهنا سنستقبل نحن الطلب ونذهب للخريطة للحصول على الصفحة المقابلة لهذا الاسم المتفرد، ونسلمها إلى Razor لعرضها :).. وهكذا يعمل كل شيء على ما يرام.

 

نعم.. هذه هي الفكرة الرئيسية البسيطة التي كتبتها في يوم واحد!

لم تكن فيجوال بيزيك تحتاج إلا إلى محرك عرض ملفات تخيلي (لو نظرتم في الكود لوجدتموه بسيطا وعدد سطوره قليلة!) إضافة إلى خريطة لاختيار الصفحة الصحيحة وتسليمها للعرض! أما الجهد الجبار الحقيقي فتقوم به XML Literals الموجودة داخل فيجوال بيزيك، والتقني المرنة المدهشة الموجودة في محرك Razor.. كل ما كان علي هو أن أنشئ جسرا قصيرا بين التقنيتين حتى يصير من الممكن كتابة عروض الويب بفيجوال بيزيك في تقنية ASP.NET MVC Core.

ملحوظة:

لن يعمل الكود عند معظمكم لأنه مكتوب بالنسخة التجريبية من VS.NET 2019 لكن الإصدار النهائي سيكون يوم 2 أبريل بإذن الله (بعد 4 أيام).. كما أن الكود يستخدم النسخة التجريبية من.NET Core 3.0  وأمام الإصدار النهائي عدة أشهر، لهذا لا بد من تنزيل هذه النسخة التجريبية من الإصدار الثالث لنواة دوت نت حتى يعمل المشروع.

لكن عامة، يمكنكم إنشاء مشروع جديد في فيجوال ستديو 2017 ونسخ ملفات Vazor إليه وستعمل بشكل صحيح.. الفارق كله في إصدار الحزم الإضافية Nugets.. هناك مشكلة واحدة فقط ستحدث في تسجل مزود الملفات التخيلي، إذا واجهت أحدكم فليسألني وسأخبره كيف يحلها.

سأشرح تفاصيل استخدام Vazor في منشور تال بإذن الله.

ليست هناك تعليقات:

إرسال تعليق

ملحوظة: يمكن لأعضاء المدونة فقط إرسال تعليق.