سؤال

ما هي إيجابيات وسلبيات استخدام Enterprise Library Unity مقابل حاويات IoC الأخرى (Windsor، Spring.Net، Autofac ..)؟

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

المحلول

أقوم بإعداد عرض تقديمي لمجموعة مستخدمين.على هذا النحو مررت للتو بمجموعة منهم.يسمى:AutoFac، وMEF، وNinject، وSpring.Net، وStructureMap، وUnity، وWindsor.

أردت أن أعرض حالة 90% (حقن المُنشئ، وهو ما يستخدمه الأشخاص بشكل أساسي في بطاقة IOC على أي حال).يمكنك التحقق من الحل هنا (VS2008)

وعلى هذا النحو، هناك بعض الاختلافات الرئيسية:

  • التهيئة
  • استرجاع الكائن

كل واحد منهم لديه ميزات أخرى أيضًا (بعضها يحتوي على AOP، وأدوات أفضل، ولكن عمومًا كل ما أريد من IOC أن تفعله هو إنشاء الكائنات واستردادها لي)

ملحوظة:يمكن إلغاء الاختلافات بين استرجاع كائنات المكتبات المختلفة باستخدام CommonServiceLocator: http://www.codeplex.com/CommonServiceLocator

وهذا يتركنا مع التهيئة، والتي تتم بطريقتين:عبر الكود أو عبر تكوين XML (app.config/web.config/custom.config).البعض يدعم الاثنين والبعض يدعم واحد فقطيجب أن أشير إلى:يستخدم البعض سمات لمساعدة IoC على طول الطريق.

إذن هذا هو تقييمي للاختلافات:

نينجيكت

تهيئة الكود فقط (مع السمات).آمل أن تكونوا مثل لامدا.يبدو رمز التهيئة كما يلي:

 IKernel kernel = new StandardKernel(
                new InlineModule(
                    x => x.Bind<ICustomerRepository>().To<CustomerRepository>(),
                    x => x.Bind<ICustomerService>().To<CustomerService>(),
                    x => x.Bind<Form1>().ToSelf()
                    ));

خريطة الهيكل

رمز التهيئة أو XML أو السمات.v2.5 هو أيضًا لامبادي جدًا.وبشكل عام، هذا هو واحد من المفضلة.بعض الأفكار المثيرة للاهتمام حول كيفية استخدام StructureMap للسمات.

ObjectFactory.Initialize(x =>
{
    x.UseDefaultStructureMapConfigFile = false;
    x.ForRequestedType<ICustomerRepository>()
        .TheDefaultIsConcreteType<CustomerRepository>()
        .CacheBy(InstanceScope.Singleton);

    x.ForRequestedType<ICustomerService>()
        .TheDefaultIsConcreteType<CustomerService>()
        .CacheBy(InstanceScope.Singleton);

    x.ForConcreteType<Form1>();
 });

وحدة

رمز التهيئة وXML.مكتبة جميلة، ولكن تكوين XML يمثل ألمًا في المؤخرة.مكتبة رائعة لشركة Microsoft أو متاجر الطرق السريعة.تهيئة الكود سهلة:

 container.RegisterType<ICustomerRepository, CustomerRepository>()
          .RegisterType<ICustomerService, CustomerService>();

Spring.NET

XML فقط هو الأقرب بقدر ما أستطيع أن أقول.ولكن بالنسبة للوظائف، يقوم Spring.Net بكل شيء تحت الشمس يمكن أن تفعله IoC.ولكن نظرًا لأن الطريقة الوحيدة للتوحيد هي من خلال XML، يتم تجنب ذلك بشكل عام بواسطة متاجر .net.على الرغم من أن العديد من متاجر .net/Java تستخدم Spring.Net بسبب التشابه بين إصدار .net من Spring.Net ومشروع Java Spring.

ملحوظة:أصبح التكوين في الكود ممكنًا الآن مع تقديم Spring.NET CodeConfig.

وندسور

XML والرمز.مثل Spring.Net، ستفعل Windsor أي شيء تريد أن تفعله.من المحتمل أن تكون Windsor واحدة من أكثر حاويات IoC شيوعًا.

IWindsorContainer container = new WindsorContainer();
container.AddComponentWithLifestyle<ICustomerRepository, CustomerRepository>("CustomerRepository", LifestyleType.Singleton);
container.AddComponentWithLifestyle<ICustomerService, CustomerService>("CustomerService",LifestyleType.Singleton);
container.AddComponent<Form1>("Form1");

أوتوفاك

يمكن مزج كل من XML والرمز (مع الإصدار 1.2).مكتبة IoC بسيطة وجميلة.يبدو أنه يقوم بالأساسيات دون الكثير من الضجة.يدعم الحاويات المتداخلة مع تحديد النطاق المحلي للمكونات وإدارة محددة جيدًا مدى الحياة.

إليك كيفية تهيئته:

var builder = new ContainerBuilder();
builder.Register<CustomerRepository>()
        .As<ICustomerRepository>()
        .ContainerScoped();
builder.Register<CustomerService>()
        .As<ICustomerService>()
        .ContainerScoped();
builder.Register<Form1>();

لو كان علي أن أختار اليوم:ربما سأختار StructureMap.إنه يتمتع بأفضل دعم لميزات لغة C# 3.0، وأكثر مرونة في التهيئة.

ملحوظة:حول كريس براندسما إجابته الأصلية إلى أ مشاركة مدونة.

نصائح أخرى

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

وعيب واحد هو أنه جديد بدلا لذلك قد يكون الخلل أن اللاعبين كبار السن وفرز بالفعل.

وأما وقد قلت ذلك، قد ترغب في <لأ href = "http://weblogs.asp.net/podwysocki/archive/2008/02/22/ioc-and-the-unity-application-block-going- deeper.aspx "يختلط =" noreferrer "> التحقق من ذلك .

وقديم موضوع ولكن لأن هذا هو أول شيء أن جوجل أظهر لي عندما كنت كتبته في وحدة مقابل spring.net ...

والربيع يفعل CodeConfig الآن إذا كنت لا تحب التكوين XML

http://www.springframework.net/codeconfig/doc-latest / المرجع / أتش تي أم أل /

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

وتصحيح لي إذا كنت مخطئا ولكن أعتقد Autofac نفسه يدعم تكوين XML كما هو موضح في هذا الرابط: <لأ href = "http://code.google.com/p/autofac/wiki/XmlConfiguration" يختلط = " نوفولو noreferrer "> Autofac XML تكوين

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

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

وأود أن أعرف إذا كان الوحدة: لا يمكن القيام بذلك.

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

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

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

يمكن أن يتم الوحدة لعدم رمي SynchronizationLockException في كل وقت؟

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