سؤال

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

لذلك قمت بإعادة صياغة القليل من التعليمات البرمجية وأردت أن أعرف ما إذا كان لدي حق (أنا أستخدم Castle Windsor كإطار DI).

أولا جردت سمة لي لاحتواء البيانات الأولية التي أحتاجها

giveacodicetagpre.

قمت بإنشاء مرشح ترخيص مخصص يحتوي على منطق تحديد ما إذا كان المستخدم الحالي لديه إذن مناسب

giveacodicetagpre.

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

giveacodicetagpre.

الخطوة الأخيرة هي تسجيل مزود المرشح في Global.asax

giveacodicetagpre.

لذلك أنا أتساءل أولا، إذا حصلت على الفكرة الصحيحة والثانية، فما يمكن تحسينه.

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

المحلول

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

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

إذا كنت على استعداد للجمع بين السمة مع مرشح واستخدام الخاصية DI، فهناك طريقة بسيطة للحصول على مزود تصفية أكثر انفصالا. فيما يلي أمثلة على هذا النهج: http://www.thecodinghumanist.com/blog/archives/201/2/20 http://lozanotek.com/blog/archive/201/201/201/201. /dependency_injection_for_filters_in_mvc3.aspx

هناك تحديان لحلها مع النهج الحالي: 1. حقن بعض، ولكن ليس كل شيء، من معلمات منشئ التصفية عبر di. 2. رسم الخرائط من سمة مثيل عامل تصفية (حقن).

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

للتحدي رقم 1، يمكنك استخدام شيء مثل التحميل الزائد _container.resolve الذي يتيح لك تمرير الحجج. هذا الحل هو نوع الحاويات المحددة وربما صعبة بعض الشيء.

حلا آخر، الذي أصف هنا، يفصل من فئة المصنع يتطلب تبعا فقط في منشئه وينتج مثيل مرشح يتطلب كل من الحجج DI وغير DI.

إليك ما قد يبدو هذا المصنع:

giveacodicetagpre.

تقوم بعد ذلك بتنفيذ مصنع لكل زوج سمة / مرشح:

giveacodicetagpre.

يمكنك حل التحدي رقم 2 بمجرد تسجيل كل تطبيق لكل تطبيق iFilterInstanceFactory مع CastleWindsor.

يمكن الآن فصل مزود المرشح من أي معرفة بسموحات ومعدل محددة:

giveacodicetagpre.

david

نصائح أخرى

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

giveacodicetagpre.

الذي يمكنك إضافته إلى السمة الأصلية كما يلي.

giveacodicetagpre.

السمة المرتبطة تبدو مثل هذا.

giveacodicetagpre.

ثم يمكنك استرداد المرشح الصحيح عن طريق سحب filterType من هذه السمة.

giveacodicetagpre.

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

من الواضح أننا نحتاج أيضا إلى إضافة معالجة خطأ، على سبيل المثالإذا لم يكن هناك oubailtertattribute ...

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