ما هو السبب وراء هذا السلوك IOC (حل مع مكونات متعددة مسجلة)

StackOverflow https://stackoverflow.com/questions/1381584

سؤال

يبدو وكأنه نهج قياسي للـ IOC عند إعطاء سيناريو مثل (C# Windsor):

container.AddComponent<ILogger, HttpLogger>();
container.AddComponent<ILogger, SmtpLogger>();

var logger = container.Resolve<ILogger>();

سيكون أنه عند حل المكون ، فإن أول Ilogger المسجل (Httplogger في هذه الحالة) هو المرشح الوحيد للحل ، فستجد IOC بعد ذلك مُنشئ "Fattest" الذي يمكنه حيث يعتقد أنه يمكنه حل جميع التبعيات.

ومع ذلك ، قد يكون من الممكن أن يحل IOC التبعيات للمسجل الأول ، وبالتالي سيعود مع مشكلة في القرار ، فقد يكون من الممكن حل Smtplogger إذا حاولت IOC ذلك.

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

فلماذا لا تختار من جميع مُنشئين جميع الأنواع القابلة للتطبيق ، والبدء في محاولة حلها من أرقى المنشئين إلى أسفل (لاأدري من النوع الحقيقي)؟

قد يكون لهذا إجابة واضحة حقًا ، لكنني بصراحة لا أعرف ذلك.

شكرا مقدما ، ستيفن.

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

المحلول

والسبب في ذلك هو تأثيره على تعقيد التنفيذ.

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

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

MEF ، على الرغم من أنها ليست حاوية IOC بشكل صارم ، تقوم بذلك بطريقة مشابهة لما اقترحته - إنه جزء من سلوك التكوين المستقر ، وهو شيء نشير إليه باسم "الرفض".

http://blogs.msdn.com/nblumhardt/archive/2009/07/17/light-up-or-mef-optional-exports.aspx

في سيناريوهات المكونات الإضافية ذات الديناميكية العالية ، يعد الرفض مفيدًا للغاية. في السيناريوهات Windsor و Autofac وما إلى ذلك ، تستهدف الجهد الإضافي لا يؤتي ثماره كثيرًا.

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