سؤال

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

لقد أنشأت الهيكل التالي لمصنعي يعتمد على مقال من قبل جرانفيل بارنيت dotnetslackers.com.

نمط المصنع http://img11.imageshack.us/img11/8382/factoryi.jpg.

من أجل جعل تطبيق البحث هذا أسهل في صيانة، كان تفكيري هو إنشاء مجموعة من جداول قاعدة البيانات التي يمكن استخدامها لتحديد أنواع القوالب الفردية التي يمكن أن تشير إليها نمط المصنع من أجل تحديد القالب الذي ينشئه. أحسب أنني سأحتاج إلى أن ألقي نظرة على طاولة قد تم استخدامها لتحديد نوع القالب لإنشاء مصدر بيانات نتائج البحث. ثم أحتاج إلى أن يكون لديك جدول (طاولات) لتحديد الحقول المعروضة لعرضها لنوع القالب هذا. سأحتاج أيضا إلى جدول (أو أعمدة إضافية داخل جدول القالب) الذي سيتم استخدامه لتحديد كيفية تقديم هذا الحقل (أي الارتباط التشعبي، التسمية، CSSClass، إلخ).

هل لدى أي شخص أي أمثلة على نمط مثل هذا؟ أخبرونى من فضلكم. شكرا، robert.

هل كانت مفيدة؟

المحلول

أود أن أقدم أن هذا الحل المقترح لا يقل الصيانة من مجرد ربط مصدر بيانات لقالب التعليمات البرمجية، كما لديك حاليا الآن. في الواقع، سأذهب حتى الآن ليقول أنك ستفقد المرونة من خلال الضغط على مخطط القالب ومعلومات تقديم قاعدة بيانات، مما سيعقد تطبيقك أكثر صعوبة في الحفاظ عليه.

على سبيل المثال، دعونا نفترض أن لديك مصادر البيانات هذه مع سمات (إذا كنت أفهم هذا بشكل صحيح):

Document { Author, DateModified }
Picture { Size, Caption, Image }
Song { Artist, Length, AlbumCover }

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

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

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

هذه هي الطريقة التي يكسر فيها التصميم، لأنك فقدت الآن المرونة لتحديد قوالب مختلفة لكل مصدر بيانات. الشيء الآخر الذي تخسره هو الحصول على القوالب الخاصة بك في تحكم المصدر.

أود أن أنظر إلى كيفية إعادة استخدام العناصر / الضوابط المشتركة في وجهات نظرك المنبعثة، ولكن الحفاظ على التعيين في المصنع بين القالب ومصدر البيانات، والحفاظ على القوالب كملفات منفصلة لكل مصدر بيانات. انظر إلى الحفاظ على التقديم عبر CSS أو إعدادات التكوين مماثلة. لتسهيل الصيانة، بالنظر إلى تصدير التعيينات كملف XML بسيط. لنشر مصدر بيانات جديد، يمكنك ببساطة إضافة رسم خرائط، وإنشاء ملف القالب والكمبيوتر المناسب المناسب، وإسقاطها في المواقع المتوقعة.

استجابة للتعليقات أدناه:

يعني أن بيان تبديل بسيط يجب أن يكفي:

switch (resultType)
{
    case (ResultType.Song):
      factory = new SongResultFactory();
      template = factory.BuildResult();
      break;
    // ...

حيث لديك منطق لإخراج قالب معين. إذا كنت تريد شيئا أكثر ضغطا من بيان التبديل الطويل، فيمكنك إنشاء تعيينات في القاموس، مثل هذا:

IDictionary<ResultType, ResultFactory> TemplateMap;
mapping = new Dictionary<ResultType, ResultFactory>();
mapping.Add(ResultType.Song, new SongResultFactory());
// ... for all mappings.

ثم، بدلا من عبارة "تبديل"، يمكنك القيام بهذا بطانة One:

template = TemplateMap[resultType].CreateTemplate();

كانت حجتي الرئيسية أنه في مرحلة ما، لا يزال يتعين عليك الحفاظ على التعيينات - إما في قاعدة البيانات، بيان تبديل كبير، أو هذه الحالة البيانية التي يجب تهيئةها.

يمكنك أن تأخذ ذلك وتخزين التعيينات في ملف XML بسيط يقرأ في:

<TemplateMap>
    <Mapping ResultType="Song" ResultFactoryType="SongResultFactory" />
    <!-- ... -->
</TemplateMap>

واستخدام انعكاس وآخرون. آل. لملء التبنية. ما زلت تحافظ على التعيينات، ولكن الآن في ملف XML، قد يكون من الأسهل نشره.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top