एंटरप्राइज़ लाइब्रेरी यूनिटी बनाम अन्य IoC कंटेनर (विंडसर, स्प्रिंग.नेट, ऑटोफैक ..) का उपयोग करने के पेशेवरों और विपक्षों के लिए क्या है?
एंटरप्राइज़ लाइब्रेरी यूनिटी बनाम अन्य IoC कंटेनर (विंडसर, स्प्रिंग.नेट, ऑटोफैक ..) का उपयोग करने के पेशेवरों और विपक्षों के लिए क्या है?
जवाबों:
मैं एक उपयोगकर्ता समूह के लिए एक प्रस्तुति तैयार कर रहा हूं। जैसे मैं बस उनमें से एक गुच्छा के माध्यम से चला गया। अर्थात्: ऑटोफैक, एमईएफ, निनजेक्ट, स्प्रिंग.नेट, स्ट्रक्च्योरपाइप, यूनिटी और विंडसर।
मैं 90% मामले (कंस्ट्रक्टर इंजेक्शन, जो मुख्य रूप से लोगों को वैसे भी आईओसी का उपयोग करता है) को दिखाना चाहता था। आप यहाँ समाधान की जाँच कर सकते हैं (VS2008)
जैसे, कुछ प्रमुख अंतर हैं:
उनमें से प्रत्येक में अन्य विशेषताएं भी हैं (कुछ में एओपी है, और बेहतर गिज़्म हैं, लेकिन आम तौर पर सभी मुझे एक आईओसी चाहते हैं जो मेरे लिए ऑब्जेक्ट बनाना और पुनः प्राप्त करना है)
नोट: विभिन्न पुस्तकालयों वस्तु पुनर्प्राप्ति के बीच के मतभेदों को कॉमनसेवलेकॉकर का उपयोग करके नकारा जा सकता है: http://www.codeplex.com/CommonServiceLocator
यह हमें आरंभीकरण के साथ छोड़ देता है, जो दो तरीकों से किया जाता है: कोड के माध्यम से या XML कॉन्फ़िगरेशन (app.config / web.config / custom.config) के माध्यम से। कुछ दोनों का समर्थन करते हैं, कुछ केवल एक का समर्थन करते हैं। मुझे ध्यान देना चाहिए: आईओसी की मदद करने के लिए कुछ उपयोग विशेषताएँ।
तो यहाँ मेरे मतभेद का आकलन है:
कोड आरंभीकरण (केवल विशेषताओं के साथ)। मुझे आशा है कि आपको लंबोदर पसंद होंगे। प्रारंभिक कोड इस तरह दिखता है:
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 भी बहुत लम्बा है। सब सब में, यह मेरे पसंदीदा में से एक है। कुछ बहुत ही दिलचस्प विचारों के बारे में कि कैसे स्ट्रक्च्योर मैप का उपयोग करता है।
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>();
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");
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 भाषा सुविधाओं के लिए सबसे अच्छा समर्थन है, और आरंभीकरण में सबसे अधिक लचीलापन है।
नोट : क्रिस ब्रांड्समा ने अपने मूल उत्तर को ब्लॉग पोस्ट में बदल दिया ।
जहाँ तक मैंने देखा है कि वे बहुत ही समान हैं, कुछ कार्यान्वयन विवरणों को छोड़कर यहाँ और वहाँ। यूनिटी की प्रतिस्पर्धा में सबसे बड़ा फायदा यह है कि यह माइक्रोसॉफ्ट द्वारा प्रदान की जाती है, वहाँ बहुत सारी कंपनियां हैं जो ओएसएस से डरती हैं।
एक नुकसान यह है कि यह नया है, इसलिए इसमें बग हो सकते हैं कि पुराने खिलाड़ी पहले ही हल कर चुके हैं।
ऐसा कहने के बाद, आप इसकी जांच कर सकते हैं ।
पुराना धागा लेकिन चूंकि यह पहली चीज है जो Google ने मुझे तब दिखाई जब मैंने एकता बनाम स्प्रिंग.नेट में टाइप किया ...
यदि आप XML कॉन्फ़िगरेशन पसंद नहीं करते हैं तो स्प्रिंग अब CodeConfig करता है
http://www.springframework.net/codeconfig/doc-latest/reference/html/
इसके अलावा, स्प्रिंग सिर्फ एक डीआई कंटेनर की तुलना में बहुत अधिक है, अगर आप डॉक्स में 'मॉड्यूल' खंड को देखते हैं, तो डीआई कंटेनर उन चीजों के विशाल ढेर की नींव है जो यह करता है।
अगर मैं गलत हूं तो मुझे सुधारें लेकिन मुझे लगता है कि ऑटोफेक स्वयं इस लिंक में सूचीबद्ध एक्सएमएल कॉन्फ़िगरेशन का समर्थन करता है: ऑटोफाक एक्सएमएल कॉन्फ़िगरेशन
स्प्रिंग में एक विशेषता है कि यह पैरामीटर का निर्माण कर सकता है पैरामीटर या नाम या स्थिति के आधार पर संपत्ति। यह बहुत उपयोगी है यदि पैरामीटर या संपत्ति एक साधारण प्रकार (जैसे एक पूर्णांक, एक बूलियन) है। उदाहरण यहाँ देखें । मुझे नहीं लगता कि यह वास्तव में वसंत की अक्षमता के लिए कोड में अक्षमता के लिए बनाता है।
विंडसर ऐसा भी कर सकता है, और यह कोड में कर सकता है कॉन्फ़िगर नहीं। (मुझे सही करें अगर मैं गलत हूं, तो मैं वही कर रहा हूं जो मैंने यहां सुना है)।
मैं जानना चाहूंगा कि क्या एकता ऐसा कर सकती है।
एक बात ध्यान दें: Ninject केवल IoC कंटेनर है जो प्रासंगिक निर्भरता इंजेक्शन (उनकी वेब साइट के अनुसार) का समर्थन करता है। हालाँकि, क्योंकि मेरे पास अन्य आईओसी कंटेनरों के साथ अनुभव नहीं है, इसलिए मैं नहीं बता सकता कि क्या है।
बस अपने 2 सेंट जोड़ने के लिए, मैंने दोनों संरचना और एकता की कोशिश की है। मैंने पाया कि स्ट्रक्च्योर मैप खराब / गलत तरीके से प्रलेखित है, कॉन्फ़िगर करने के लिए बट में दर्द, और उपयोग करने के लिए क्लंकी। इसी तरह, यह कंसॉल्यूशन टाइम पर कंस्ट्रक्टर के तर्क जैसे परिदृश्यों का समर्थन नहीं करता है, जो मेरे लिए एक महत्वपूर्ण उपयोग बिंदु था। इसलिए मैंने इसे गिरा दिया और एकता के साथ चला गया, और यह वह कर रहा था जो मुझे लगभग 20 मिनट में चाहिए था।
मैं व्यक्तिगत रूप से एकता का उपयोग करता हूं, लेकिन केवल इसलिए कि यह माइक्रोसॉफ्ट से है। मुझे एक कारण से निर्णय पर पछतावा है: सबसे बड़ी बात यह है कि इसके खिलाफ एक बड़ा "बग" है जो इसे लगातार अपवादों को फेंकने का कारण बनता है। आप डिबगिंग करते समय अपवादों को अनदेखा कर सकते हैं। हालाँकि यह आपके अनुप्रयोग को बहुत धीमा कर देता है यदि आप इसके पार चलते हैं, क्योंकि अपवाद फेंकना एक महंगा ऑपरेशन है। उदाहरण के लिए, मैं वर्तमान में अपने कोड में एक स्थान पर इस अपवाद को "फिक्सिंग" कर रहा हूं जहां यूनिटी के अपवाद एक पृष्ठ के रेंडर समय में अतिरिक्त 4 सेकंड जोड़ते हैं । अधिक विवरण और वर्कअराउंड के लिए, देखें:
क्या एकता को हर समय SynchronizationLockException नहीं फेंकने के लिए बनाया जा सकता है?