एंटरप्राइज़ लाइब्रेरी यूनिटी बनाम अन्य IoC कंटेनर [बंद]


135

एंटरप्राइज़ लाइब्रेरी यूनिटी बनाम अन्य IoC कंटेनर (विंडसर, स्प्रिंग.नेट, ऑटोफैक ..) का उपयोग करने के पेशेवरों और विपक्षों के लिए क्या है?


9
इस प्रकार के प्रश्न हमेशा बंद रहते हैं। राय महत्वपूर्ण हैं। वहाँ एक जगह है जहाँ उन्हें जगह है?
जेसन मार्तज्या

1
@JesonMartajaya, मैं बिल्कुल उसी टिप्पणी की सराहना करना चाहता था, यह कष्टप्रद है कि प्रश्न बंद हो रहे हैं, लेकिन विकल्प के लिए कोई जवाब नहीं।
मोहम्मद नोरेल्डिन

जवाबों:


234

मैं एक उपयोगकर्ता समूह के लिए एक प्रस्तुति तैयार कर रहा हूं। जैसे मैं बस उनमें से एक गुच्छा के माध्यम से चला गया। अर्थात्: ऑटोफैक, एमईएफ, निनजेक्ट, स्प्रिंग.नेट, स्ट्रक्च्योरपाइप, यूनिटी और विंडसर।

मैं 90% मामले (कंस्ट्रक्टर इंजेक्शन, जो मुख्य रूप से लोगों को वैसे भी आईओसी का उपयोग करता है) को दिखाना चाहता था। आप यहाँ समाधान की जाँच कर सकते हैं (VS2008)

जैसे, कुछ प्रमुख अंतर हैं:

  • प्रारंभ
  • वस्तु पुनर्प्राप्ति

उनमें से प्रत्येक में अन्य विशेषताएं भी हैं (कुछ में एओपी है, और बेहतर गिज़्म हैं, लेकिन आम तौर पर सभी मुझे एक आईओसी चाहते हैं जो मेरे लिए ऑब्जेक्ट बनाना और पुनः प्राप्त करना है)

नोट: विभिन्न पुस्तकालयों वस्तु पुनर्प्राप्ति के बीच के मतभेदों को कॉमनसेवलेकॉकर का उपयोग करके नकारा जा सकता है: http://www.codeplex.com/CommonServiceLocator

यह हमें आरंभीकरण के साथ छोड़ देता है, जो दो तरीकों से किया जाता है: कोड के माध्यम से या XML कॉन्फ़िगरेशन (app.config / web.config / custom.config) के माध्यम से। कुछ दोनों का समर्थन करते हैं, कुछ केवल एक का समर्थन करते हैं। मुझे ध्यान देना चाहिए: आईओसी की मदद करने के लिए कुछ उपयोग विशेषताएँ।

तो यहाँ मेरे मतभेद का आकलन है:

Ninject

कोड आरंभीकरण (केवल विशेषताओं के साथ)। मुझे आशा है कि आपको लंबोदर पसंद होंगे। प्रारंभिक कोड इस तरह दिखता है:

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

StructureMap

प्रारंभ कोड या XML या विशेषताएँ। v2.5 भी बहुत लम्बा है। सब सब में, यह मेरे पसंदीदा में से एक है। कुछ बहुत ही दिलचस्प विचारों के बारे में कि कैसे स्ट्रक्च्योर मैप का उपयोग करता है।

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 केवल उतना ही निकट है जितना मैं बता सकता हूं। लेकिन कार्यक्षमता के लिए स्प्रिंग.नेट सूर्य के नीचे वह सब कुछ करता है जो एक आईओसी कर सकता है। लेकिन क्योंकि Unitize का एकमात्र तरीका XML के माध्यम से है। यह आम तौर पर .net दुकानों से बचा जाता है। हालाँकि, बहुत से .net / Java शॉप, Spring.Net का उपयोग करते हैं। स्प्रिंग.नेट के .net संस्करण और जावा स्प्रिंग प्रोजेक्ट के बीच समानता के कारण।

नोट : कोड में कॉन्फ़िगरेशन अब स्प्रिंगनेट कोडकॉन्फिग की शुरुआत के साथ संभव है ।

विंडसर

XML और कोड। स्प्रिंग.नेट की तरह, विंडसर ऐसा कुछ भी करेगा जिसे आप करना चाहते हैं। विंडसर संभवतः सबसे लोकप्रिय IoC कंटेनरों में से एक है।

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

Autofac

XML और कोड (v1.2 के साथ) दोनों को मिला सकते हैं। अच्छा सरल IoC पुस्तकालय। बहुत उपद्रव के साथ मूल बातें करने के लिए लगता है। घटकों के स्थानीय स्कूपिंग और एक अच्छी तरह से परिभाषित जीवन-समय प्रबंधन के साथ नेस्टेड कंटेनरों का समर्थन करता है।

यहां बताया गया है कि आप इसे कैसे आरंभ करते हैं:

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

अगर मुझे आज का चुनाव करना होता तो: मैं शायद स्ट्रक्चुरेस्पोर्ट के साथ जाता। इसमें C # 3.0 भाषा सुविधाओं के लिए सबसे अच्छा समर्थन है, और आरंभीकरण में सबसे अधिक लचीलापन है।

नोट : क्रिस ब्रांड्समा ने अपने मूल उत्तर को ब्लॉग पोस्ट में बदल दिया ।


1
केवल Xml कॉन्फ़िगरेशन, इसे कॉन्फ़िगर करना बहुत कठिन है। मूल रूप से, केवल लोग जो मुझे देखते हैं कि स्प्रिंग.नेट का उपयोग करना चाहते हैं वे पूर्व जावा डेवलपर्स हैं।
क्रिस ब्रांड्समा

क्रिस, अपने निष्कर्षों के बारे में: क्या आप कृपया a) पर कुछ और विवरण दे सकते हैं, जो C # 3 की विशेषताएं बता रहे हैं, और b) आपके लिए किस प्रकार के आरंभीकरण महत्वपूर्ण हैं? धन्यवाद!
निकोलस ब्लमहार्ड

2
हाय निकोलस: C # 3 समर्थन के लिए, वह सब कुछ जो ऑटोफेक पहले से करता है। :) आरंभीकरण के लिए, मुझे एकल / गैर एकल और प्रति-सत्र आरंभीकरण के लिए आसान समर्थन चाहिए। अंत में, मैं कस्टम नाम से संदर्भ के लिए आसान तरीके चाहता हूं। (ऐसा कुछ जो स्ट्रक्चुरपेज़ में PITA है)। अंतिम विशेषता जो मुझे तब से अधिक पसंद है जब मैंने इसे मूल रूप से लिखा था: ऑटोकॉकिंग। मैं इसे हर समय उपयोग नहीं करता, लेकिन यह बहुत अच्छा है कि यह बेहतर है।
क्रिस ब्रांड्समा

आपने MEF का भी उल्लेख किया है, मैं अपने IRepository कार्यान्वयन वस्तुओं को वितरित करने के लिए MEF का उपयोग करता हूं और पाता हूं कि यह ठीक काम करता है। MEF पर आपके विचार क्या हैं?
टेरजेटाइल

यहाँ एक अच्छा, 20-मिनट का स्क्रैन्कैस्ट
Pat

7

जहाँ तक मैंने देखा है कि वे बहुत ही समान हैं, कुछ कार्यान्वयन विवरणों को छोड़कर यहाँ और वहाँ। यूनिटी की प्रतिस्पर्धा में सबसे बड़ा फायदा यह है कि यह माइक्रोसॉफ्ट द्वारा प्रदान की जाती है, वहाँ बहुत सारी कंपनियां हैं जो ओएसएस से डरती हैं।

एक नुकसान यह है कि यह नया है, इसलिए इसमें बग हो सकते हैं कि पुराने खिलाड़ी पहले ही हल कर चुके हैं।

ऐसा कहने के बाद, आप इसकी जांच कर सकते हैं ।


4

पुराना धागा लेकिन चूंकि यह पहली चीज है जो Google ने मुझे तब दिखाई जब मैंने एकता बनाम स्प्रिंग.नेट में टाइप किया ...

यदि आप XML कॉन्फ़िगरेशन पसंद नहीं करते हैं तो स्प्रिंग अब CodeConfig करता है

http://www.springframework.net/codeconfig/doc-latest/reference/html/

इसके अलावा, स्प्रिंग सिर्फ एक डीआई कंटेनर की तुलना में बहुत अधिक है, अगर आप डॉक्स में 'मॉड्यूल' खंड को देखते हैं, तो डीआई कंटेनर उन चीजों के विशाल ढेर की नींव है जो यह करता है।


3

अगर मैं गलत हूं तो मुझे सुधारें लेकिन मुझे लगता है कि ऑटोफेक स्वयं इस लिंक में सूचीबद्ध एक्सएमएल कॉन्फ़िगरेशन का समर्थन करता है: ऑटोफाक एक्सएमएल कॉन्फ़िगरेशन


2

स्प्रिंग में एक विशेषता है कि यह पैरामीटर का निर्माण कर सकता है पैरामीटर या नाम या स्थिति के आधार पर संपत्ति। यह बहुत उपयोगी है यदि पैरामीटर या संपत्ति एक साधारण प्रकार (जैसे एक पूर्णांक, एक बूलियन) है। उदाहरण यहाँ देखें । मुझे नहीं लगता कि यह वास्तव में वसंत की अक्षमता के लिए कोड में अक्षमता के लिए बनाता है।

विंडसर ऐसा भी कर सकता है, और यह कोड में कर सकता है कॉन्फ़िगर नहीं। (मुझे सही करें अगर मैं गलत हूं, तो मैं वही कर रहा हूं जो मैंने यहां सुना है)।

मैं जानना चाहूंगा कि क्या एकता ऐसा कर सकती है।


2

एक बात ध्यान दें: Ninject केवल IoC कंटेनर है जो प्रासंगिक निर्भरता इंजेक्शन (उनकी वेब साइट के अनुसार) का समर्थन करता है। हालाँकि, क्योंकि मेरे पास अन्य आईओसी कंटेनरों के साथ अनुभव नहीं है, इसलिए मैं नहीं बता सकता कि क्या है।


यदि यह सब "संदर्भ पर निर्भरता इंजेक्शन" है तो निनोजे में है .. उह, कुछ खास नहीं है। कम से कम यूनिटी, ऑटोफेक, विंडसर में समर्थित (विभिन्न माध्यमों से)।
user2864740

1

बस अपने 2 सेंट जोड़ने के लिए, मैंने दोनों संरचना और एकता की कोशिश की है। मैंने पाया कि स्ट्रक्च्योर मैप खराब / गलत तरीके से प्रलेखित है, कॉन्फ़िगर करने के लिए बट में दर्द, और उपयोग करने के लिए क्लंकी। इसी तरह, यह कंसॉल्यूशन टाइम पर कंस्ट्रक्टर के तर्क जैसे परिदृश्यों का समर्थन नहीं करता है, जो मेरे लिए एक महत्वपूर्ण उपयोग बिंदु था। इसलिए मैंने इसे गिरा दिया और एकता के साथ चला गया, और यह वह कर रहा था जो मुझे लगभग 20 मिनट में चाहिए था।


1

मैं व्यक्तिगत रूप से एकता का उपयोग करता हूं, लेकिन केवल इसलिए कि यह माइक्रोसॉफ्ट से है। मुझे एक कारण से निर्णय पर पछतावा है: सबसे बड़ी बात यह है कि इसके खिलाफ एक बड़ा "बग" है जो इसे लगातार अपवादों को फेंकने का कारण बनता है। आप डिबगिंग करते समय अपवादों को अनदेखा कर सकते हैं। हालाँकि यह आपके अनुप्रयोग को बहुत धीमा कर देता है यदि आप इसके पार चलते हैं, क्योंकि अपवाद फेंकना एक महंगा ऑपरेशन है। उदाहरण के लिए, मैं वर्तमान में अपने कोड में एक स्थान पर इस अपवाद को "फिक्सिंग" कर रहा हूं जहां यूनिटी के अपवाद एक पृष्ठ के रेंडर समय में अतिरिक्त 4 सेकंड जोड़ते हैं । अधिक विवरण और वर्कअराउंड के लिए, देखें:

क्या एकता को हर समय SynchronizationLockException नहीं फेंकने के लिए बनाया जा सकता है?


चेतावनी के लिए धन्यवाद! आपके द्वारा संदर्भित प्रश्न के इस उत्तर के अनुसार , बग अब हल हो गया है।
सैम

एकता एक अपवाद क्यों फेंक रही है? आमतौर पर एक अपवाद एक 'क्रिटिकल एरर' है (जैसे अप्राप्य निर्भरता) और कुछ को दबाया नहीं जा सकता है ..
user2864740

क्षमा करें, क्या यह "बग" हल है या क्या आपने इससे बचने का तरीका ढूंढ लिया है? मैं c # .net में रूपरेखा चुन रहा हूं और अब यह जानने के लिए उत्सुक हूं कि क्या एकता अभी भी लागत है ...
जोग दान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.