DI के लिए उन्नीस बनाम एकता [बंद]


104

हम ASP.net MVC का उपयोग कर रहे हैं।

इनमें से कौन सबसे अच्छा DI फ्रेमवर्क निनजेक्ट या यूनिटी है और क्यों?


94
NInject बेहतर है क्योंकि आप उनकी वेबसाइट से कूल ब्रांडेड मैग्नेट खरीद सकते हैं।
इवान जी।

5
इस प्रश्न का अपडेट किया गया संस्करण (वैसे भी समान) जो कुछ लोगों को उपयोगी लग सकता है: stackoverflow.com/questions/4581791/…
जेसन डाउन

जवाबों:


46

पिछली बार जब मैंने उनमें से किसी एक को देखा तो मुझे निनॉज़ थोड़ा बेहतर लगा। लेकिन दोनों में अपनी कमियां हैं।

Ninject में एक बेहतर धाराप्रवाह-विन्यास योजना है। एकता ज्यादातर XML कॉन्फ़िगरेशन पर भरोसा करने लगती है। Ninject का मुख्य दोष यह है कि आपको Ninject.Core को अपने कोड में हर जगह [Inject] विशेषताएँ जोड़ने की आवश्यकता होती है।

अगर मैं पूछ सकता हूं, तो आप इन दोनों को अपनी पसंद क्यों सीमित कर रहे हैं? मुझे लगता है कि कैसल। विंडसर, ऑटोफेक और स्ट्रक्चरफोर कम से कम अच्छे या बेहतर हैं।


47
आपको केवल एक से अधिक कंस्ट्रक्टर होने पर इंजेक्ट विशेषता का उपयोग करने की आवश्यकता है और आपको निनॉज को यह बताना होगा कि किस कंस्ट्रक्टर का उपयोग करना है। डिफ़ॉल्ट रूप से यह सबसे अधिक मापदंडों के साथ कंस्ट्रक्टर का उपयोग करता है।
जेफरी कैमरन

11
इस बीच, एक आधिकारिक Ninject.Web.Mvc एक्सटेंशन भी है। आप अपने MvcApplication को NinjectHttpApplication से प्राप्त करने के लिए बदलते हैं, इसमें कर्नेल को स्पिन करते हैं और RegisterAllControllersIn (Assembly.GetExecutingAssembly ()) को कॉल करते हैं ताकि इसे दिए गए असेंबली में सभी नियंत्रकों का ध्यान रखा जा सके। जादू।
माइकल Stum

18
यह उत्तर अब Ninject 2 में रीग्रेज करने के साथ बहुत ही अप्रासंगिक है। जबकि Nin Nin 1 के लिए शिकायत वैध थी, जबकि Ninject 2 विशेषताओं के साथ वहाँ कक्षाओं को लैटर किए बिना काम करने की अनुमति देता है। Ninject2 आपकी कक्षाओं को संशोधित करने की आवश्यकता के बिना पारदर्शी रूप से काम करेगा।
चिलिटोम

3
एकता के लिए समान है क्योंकि यह इस बिंदु पर कोड के माध्यम से पूरी तरह से विन्यास योग्य प्रतीत होता है (v3.0.1304.1)
एरिक

46

मुझे पता है कि यह एक पुराना सवाल है, लेकिन यहाँ मेरे विचार हैं:

मुझे व्यक्तिगत रूप से Ninject पसंद है। मुझे धाराप्रवाह इंटरफेस और एक्सएमएल से बचना पसंद है। मैं आम तौर पर एक्सएमएल को पसंद करता हूं, बस इस तरह के कॉन्फ़िगर सामान के लिए नहीं। खासकर जब रिफ्लेक्टिंग शामिल है धाराप्रवाह इंटरफेस इसे सही करना आसान बनाते हैं।

मुझे स्ट्रक्चर्सपॉइंट के ऑब्जेक्टफैक्टिंग की याद आती है, लेकिन निनजेक्ट में इसे जोड़ने के लिए आसान वर्कआर्ड हैं।

जब जेफरी बताते हैं कि आपको केवल एक कंस्ट्रक्टर होने पर [Inject] विशेषता का उपयोग नहीं करना है।

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


10

Ninject सर्कुलर निर्भरता का पता लगाता है यदि आप Unity के विपरीत Injection कन्स्ट्रक्टर्स का उपयोग करते हैं जो कि इंजेक्शन तकनीक की परवाह किए बिना केवल एक StackOverflowException को फेंकता है जो डीबग करना बेहद कठिन है।


9

मैं मेंडेल के साथ सहमत हूं, कोई "सर्वश्रेष्ठ" डीआई फ्रेमवर्क नहीं है। यह सिर्फ स्थिति पर निर्भर करता है और उन सभी के पक्ष और विपक्ष हैं। लगता है कि डेविड हेडन ने डॉटनेट रॉक्स पर कहा कि यदि आप एंटलीब के बाकी हिस्सों का उपयोग करते हैं और इससे परिचित हैं तो एकता पसंदीदा विकल्प है। मैं व्यक्तिगत रूप से यूनिटी का उपयोग करता हूं क्योंकि मेरा ग्राहक इस तथ्य को पसंद करता है कि यह डीएलएल पर Microsoft एंटरप्राइज लाइब्रेरी (यूनिटी) कहता है , अगर आपको वह मिलता है जो मैं कह रहा हूं।

मैं इंटरफेस और उनके ठोस कार्यान्वयन की स्थापना के लिए दोनों xml कॉन्फ़िगरेशन का उपयोग करता हूं, लेकिन फिर मैं इंजेक्शन लगाते समय कोड में विशेषताओं का उपयोग करता हूं, जैसे:

<type type="ILogger" mapTo="EntLibLogger">
   <lifetime type="singleton"/>
</type>

और कोड में:

[InjectionConstructor]
public Repository([Dependency] ILogger logger)

व्यक्तिगत रूप से मुझे लगता है कि इससे स्पष्ट होता है कि क्या होता है, लेकिन निश्चित रूप से कोई यह तर्क दे सकता है कि आपके पास अपने आवेदन पर एकता के संदर्भ होंगे। यह आप पर निर्भर करता है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.