سؤال

أفكر في استخدام Microsoft Unity لأداة Dependency حقن الخاصة بي في واجهة المستخدم الخاصة بنا.

يستخدم المستوى الأوسط لدينا بالفعل Castle Windsor، لكنني أعتقد أنه يجب علي الاستمرار في استخدام Microsoft.

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

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

المحلول

إن الالتزام بحاوية واحدة ليس مهمًا حقًا، إذا تم تصميم نظامك مع وضع IoC/DI في الاعتبار.باستخدام النهج المناسب، يمكنك بسهولة تغيير مكتبة IoC في المستقبل.

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

أنصح بالاختيار بين Castle (مستخدم على نطاق واسع ويحتوي على الكثير من مكتبات التكامل) وAutofac (خفيف الوزن وسريع ويحتوي على تداخل مناسب للحاويات، ولكنه غير مستخدم على نطاق واسع)

هناك قائمة شاملة لحاويات IoC بواسطة هانسلمان

ملاحظة:أنت لا تريد استخدام الوحدة

نصائح أخرى

وقد زاد مؤخرًا استخدام 6 من هذه (وندسور, وحدة, Spring.Net, أوتوفاك, نينجيكت, خريطة الهيكل) يمكنني تقديم ملخص سريع لكل منها، ومعايير الاختيار لدينا واختيارنا النهائي.

ملحوظة:لم ننظر إلى PicoContainer.Net حيث اعتبر أحد فريقنا أن منفذ .Net سيئ جدًا مقارنة بإصدار Java.كما أننا لم ننظر إلى ObjectBuilder، حيث أن Unity مبني على ObjectBuilder2 ويعتبر خيارًا متميزًا افتراضيًا.

أولاً، أستطيع أن أقول إن جميعها تقريبًا متشابهة إلى حد ما، ويتعلق الأمر حقًا بما يناسبك حقًا، ومتطلباتك المحددة.وشملت متطلباتنا:

متطلبات

  • الحقن القائم على المنشئ (نعتزم لا لاستخدام الملكية أو المجال أو طريقة الحقن)
  • تكوين قابل للبرمجة (لا XML)
  • التسلسلات الهرمية للحاويات (واحدة لكل تطبيق، ولكل طلب، ولكل جلسة لربط نطاق عمر المكونات بالحاوية بشكل ضمني)
  • إدارة عمر المكونات (لمزيد من التحديد الدقيق للنطاق، على سبيل المثال عابر/مفرد)
  • الحقن من الواجهة إلى الكتابة أو مثيل ملموس (على سبيل المثال ILogger -> typeof(FileLogger) أو ILogger -> new FileLogger() )
  • إنشاء مكون متقدم/"آلية حدث إنشاء" للتهيئة المسبقة/اللاحقة
  • التخلص الصحيح من IDisposable المكونات الموجودة على الحاوية تمزيقها
  • معلومات موثقة جيدًا و/أو متاحة بسهولة عبر الإنترنت

    ملحوظة:في حين أن الأداء كان متطلبًا، إلا أنه لم يؤخذ في الاعتبار عند الاختيار حيث يبدو أن جميع الحاويات التي تمت مراجعتها كانت متشابهة وفقًا لهذا المعيار

امتحان

تم استخدام كل حاوية في مشروع نموذجي لنماذج الويب Asp.Net (حيث كان هذا هو نوع التطبيق المستهدف).استخدمنا صفحة واحدة بسيطة مع عنصر تحكم مستخدم واحد بسيط، كل منها يرث من الصفحة الأساسية / عنصر التحكم الأساسي على التوالي.استخدمنا حاوية واحدة في BasePage لحاوية نطاق "لكل طلب" و1 على global.asax لنطاق "تطبيق" وحاولت ربطهما معًا حتى يمكن حل التبعيات من كلتا الحاويتين.

شارك كل تطبيق ويب مجموعة مفتعلة من كائنات المجال التي تحاكي مستويات متعددة من التبعية ونوع النطاق (مفرد/عابر) وأيضًا الفئات المُدارة وغير المُدارة (IDisposable مطلوب).تم حقن مكونات التبعية "المستوى الأعلى" يدويًا من الأساليب الموجودة في ملف BasePage.

نتائج

وندسور - مستوفي لجميع المعايير ويتمتع بسجل جيد من الحالات ومجتمع المدونين والوثائق عبر الإنترنت.سهل الاستخدام وربما هو الاختيار الفعلي.إنشاء المكونات المتقدمة من خلال منشأة المصنع.يُسمح أيضًا بتسلسل الحاويات التي تم إنشاؤها بشكل فردي.

Spring.Net - وثائق مطولة وغير مفيدة وتكوين غير واضح/سهل للبرمجة.لم يدعم الأدوية العامة.لم يتم اختياره

Ninject - سهل الاستخدام مع وثائق واضحة وجيدة.مجموعة ميزات قوية تلبي جميع متطلباتنا باستثناء التسلسلات الهرمية للحاويات، لذلك للأسف لم يتم اختيارها.

StructureMap - تم توثيقه بشكل سيئ، على الرغم من وجود مجموعة ميزات متقدمة جدًا تلبي جميع متطلباتنا، ومع ذلك لم تكن هناك آلية مدمجة للتسلسلات الهرمية للحاويات على الرغم من إمكانية اختراقها معًا باستخدام حلقات for، راجع هنا بدت واجهة تعبير لامدا بطلاقة معقدة بعض الشيء في البداية، على الرغم من إمكانية تغليفها بعيدًا.

الوحدة - موثقة جيدًا وسهلة الاستخدام وتلبي جميع معايير الاختيار لدينا ولديها آلية تمديد سهلة لإضافة آلية أحداث الإنشاء السابقة/اللاحقة التي طلبناها.يجب إنشاء الحاويات الفرعية من الحاوية الأصلية.

Autofac - موثق جيدًا وسهل الاستخدام نسبيًا، على الرغم من أن تكوين تعبير lambda يبدو معقدًا بعض الشيء، إلا أنه يمكن تغليفه بسهولة مرة أخرى.يتم تحديد نطاق المكونات من خلال آلية "وضع العلامات" ويتم تكوين جميع المكونات مقدمًا باستخدام مُنشئ كان غير مريح بعض الشيء.تم إنشاء الحاويات الفرعية من الأصل وتم تعيين المكونات من "علامة".الحقن العام المسموح به.

خاتمة

كان خيارنا الأخير بين Windsor وUnity، وهذه المرة اخترنا Unity نظرًا لسهولة استخدامه وتوثيقه ونظام الإرشاد ولأنه في حالة "إنتاج".

إليك مقالة جيدة تقارن بين حاويات .NET IoC.http://blog.ashmind.com/index.php/2008/08/19/comparing-net-di-ioc-frameworks-part-1/

لقد بدأت باستخدام أوتوفاك منذ عام ولم تنظر إلى الوراء منذ ذلك الحين..

أنا من محبي Autofac، لكن كلاً من Windsor وUnity سيقومان بعمل جيد (على الرغم من أن Windsor أكثر قدرة من Unity ولا يتطلب إسناد الكود الخاص بك).هناك الكثير من الأسباب غير التقنية الجيدة للالتزام بحاوية واحدة في النظام.

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

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

ومع ذلك، فإنني أؤيد فكرة الالتزام بحاوية واحدة إن أمكن.

لقد تم استخدام إطار التوسعة المدارة ووجدت أنه من السهل جدًا العمل معه.لقد كان مدمج في .NET 4.

ما لم تكن لديك بالفعل خبرة وتفضيل شخصي لتقنية فرعية معينة يستخدمها أحد حلول حاويات IoC المحتملة، فكلها تعمل بشكل جيد ولا أرى أيًا منها على وجه الخصوص لديه "وظيفة قاتلة" تجعلها بارزة من الاخرين.من المحتمل أن تكون Unity هي الحل الأمثل للحلول التي تستخدم بالفعل P&P Enterprise Library 4.x...

معيار حاوية IoC - مقارنة الأداء يحتوي على جداول مقارنة الأداء والميزات لأكثر من 20 منتجًا ويبقيها محدثة.

الاستنتاج من المقال:

يقدم SimpleInjector و Hiro و Funq و Munq و Dynamo أفضل أداء ، فهي سريعة للغاية.جربهم!

خصوصاً حاقن بسيط يبدو أنه اختيار جيد.إنه سريع للغاية ، ولديه وثائق جيدة ويدعم أيضًا السيناريوهات المتقدمة مثل الاعتراض والديكور العام.

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