سؤال

يحتوي متصفح الوسائط على نموذج موفر، هذه هي الأساس سلسلة من الفصول الدراسية التي تسمى طلب معين لكل كيان.

لذلك على سبيل المثال لدينا:

        providers = new List<IMetadataProvider>();
        providers.Add(new ImageFromMediaLocationProvider());
        providers.Add(new ImageByNameProvider());
        providers.Add(new MovieProviderFromXml());
        providers.Add(new MovieDbProvider());
        providers.Add(new TVProviderFromXmlFiles());
        providers.Add(new TvDbProvider());
        providers.Add(new VirtualFolderProvider());
        providers.Add(new FrameGrabProvider());
        providers.Add(new MediaInfoProvider());

ترتيب مقدمي الخدمات في القائمة كبير يأخذ مزودي الطلب العالي الأسبقية على انخفاض الطلبيات.

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

المشكلة هي أنه بمجرد السماح للأحزاب الثالثة بحقن أنفسهم في السلسلة التي تفقد مكانا رئيسيا لتحديد هذا الطلب.

حلاي الحالي الذي أنا غير مريح للغاية معه هو تحديد سمة ذات أولوية اختيارية مع كل مزود ثم النظام بأولوية.

لذلك على سبيل المثال لدي الآن:

[ProviderPriority(20)]
class ImageByNameProvider{}

هذا يسمح للأحزاب الثالثة بتحديد موقفهم في السلسلة.

حلول أخرى فكرت في كانت قبل وبعد السمة على سبيل المثال.

[Before(typeof(ImageByNameProvider))]
class ImageFromMediaLocationProvider {} 

لكنني لست متأكدا مما إذا كان هذا أسهل أو أصعب في البرنامج ضده.

هل هناك أي حلول أخرى لهذه المشكلة؟ أي حل سوف تذهب إليه؟

ربما، يجب أن أبقي القائمة فقط للمقدمين الأساسيين وأضفون قبل / بعد Attrabs لموفري الطرف الثالث ...

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

المحلول

يبدو أن هناك في الواقع بعض القضايا المختلفة هنا التي يجب معالجتها. تحاول المشكلة الأساسية التوصل إلى آلية تسمح بإدراج كائن تعسفي إلى قائمة موجودة في مرحلة ما في منتصف تلك القائمة.

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

بدلا من استخدام قائمة بسيطة يجب أن تستمد قائمتك الخاصة:

class ProviderList : List<IMetadataProvider { }

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

من المحتمل أن يكون النهج الجيد هنا هو تمرير GUID من المزود الذي تريد إدراجه بعد معلمة إلى طريقة التثبيت (). ستأخذ طريقة الإزالة () بالمثل GUID من المزود المراد إزالتها.

على سبيل المثال، أقول أدرج مزود جديد بعد movieproviderfromxml. ثم يقوم الطرف الثالث الآخر أيضا بتثبيت مزود جديد بعد movieproviderfromxml. ماذا يجب أن يكون النظام الجديد؟ هل يدفع المزود الثاني دائما مباشرة بعد moveProviderFromXML أو هل يبدأ هناك ثم تخطي أي مزودي مخصصين وأدخل بعد تثبيت موفر مخصص الأخير (لذلك فقط قبل مزود "Core" التالي؟

المتعلقة بهذا السؤال هو الفكرة التي تحتاجها إلى أن يكون لها بعض الطرق للتمييز بين مقدميي "الأساس" ومزود مخصص.

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

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

تعتمد المدعون على الأولوية مشكلة في ذلك، فعليك تحديد كيفية التعامل مع الاصطدامات ذات الأولوية. فيما يتعلق بمجموعة سمة قبل / بعد، هل تسمح لكما بنفس المزود؟ ربما لا يكون الأمر كذلك، لذلك قد يكون من المنطقي إنشاء ProviderChainattribute الذي يحتوي على خاصية ChaininSert Enum، حيث يحدد chaininsert قبل وبعد قيم المعهد. يتيح لك ذلك إجبار المزود المخصص على اتخاذ قرار بشأن ما إذا كان يثبت من قبل أو بعد الموفر المحدد. ما زلت أستخدم GUID بدلا من النوع.

نأمل أن يمنحك هذا بعض الأفكار الأخرى حول كيفية الاقتراب من هذه المشكلة.

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