निर्भरता इंजेक्शन पहले भ्रमित लग सकता है, लेकिन यह वास्तव में वास्तव में काफी सरल है।
एक निर्भरता इंजेक्शन "कंटेनर" मूल रूप से एक सामान्य कारखाना है, जिसमें विभिन्न ऑब्जेक्ट आजीवन प्रबंधन सुविधाएं हैं। निनजा, विशेष रूप से, इस फैक्ट्री को भ्रमित करने के लिए सिंटैक्स kernel.Bind()
का उपयोग करता है।जब आप kernel.Bind<DbEntities>().ToSelf()
कहते हैं तो इसका अर्थ यह है कि जब भी उस प्रकार का अनुरोध किया जाता है तो निनजेक्ट बाध्य प्रकार (इस मामले में डीबीईएनटीटी) का एक उदाहरण बनायेगा। यह अनुरोध आमतौर पर इस तरह दिखता है:
var entities = kernel.Get<DbEntities>(); // Note: don't do this, just an example
इसके मूल पर, निर्भरता इंजेक्शन यही है। एक सामान्य कारखाना जो मनमाने ढंग से प्रकारों को तुरंत चालू कर सकता है।
हालांकि, इसके मुकाबले इसके लिए बहुत कुछ है। निर्भरता इंजेक्शन की एक अच्छी विशेषता यह है कि यह प्रक्रिया में किसी भी निर्भर प्रकार को भी चालू करेगा। तो, मान लीजिए कि आपके पास नियंत्रक है, और उस नियंत्रक की डीबीईएनटीटी पर निर्भरता है। खैर, जब डी नियंत्रक द्वारा एक नियंत्रक को तुरंत चालू किया जाता है, तो यह निर्भर डीबीईएनटीटी को भी चालू करेगा। नीचे दिया गया कोड देखें। जब MyController instantiated है, DbEntities स्वचालित रूप से (यह मानते हुए आप डि विन्यास में आत्म करने के लिए DbEntities वर्ग के लिए बाध्य है)
var controller = kernel.Get<MyController>();
public class MyController : Controller {
private DbEntities _entities;
public MyController(DbEntities entities) {
_entities = entities;
}
}
यह पुनरावर्ती है instantiated हो जाएगी। कोई भी वर्ग जो तत्काल हो जाता है जिसमें कोई वस्तुएं होती हैं जो स्वयं ही तत्काल हो सकती है, और इसी तरह, और आखिरकार, सब कुछ उसके काम को करने की ज़रूरत है।
अब, एमवीसी के बारे में बड़ी बात यह है कि यह किसी भी डी कंटेनर का स्वचालित रूप से उपयोग करने के लिए अंतर्निहित है। आपको kernel.Get
पर कॉल करने की आवश्यकता नहीं है क्योंकि जब यह अनुरोध आता है तो नियंत्रक बनाता है जब फ्रेमवर्क आपके लिए करता है। इस सुविधा को IDependencyResolver
कहा जाता है, और यह एक इंटरफेस है कि एमवीसी फ्रेमवर्क तीसरे पक्ष के डी कंटेनर का उपयोग करने की अनुमति देने के लिए उपयोग करता है ढांचे के द्वारा।
आप Nuget पैकेज Ninject.MVC3 का उपयोग कर तो यह आपके लिए अपने आप यह सब कॉन्फिगर करेगा द्वारा Ninject स्थापित करते हैं, और आप केवल RegisterServices करने के लिए अपने बाइंडिंग जोड़ने (की जरूरत है) NinjectMVC3.cs
की धारा
बहुत सी चीज़ें हैं इससे इससे अधिक, लेकिन इससे आपको बुनियादी समझ मिलनी चाहिए। निर्भरता इंजेक्शन आपको वस्तुओं के निर्माण और नष्ट होने के प्रबंधन के विवरणों को भूलने की अनुमति देता है, आप बस अपने कन्स्ट्रक्टर में निर्दिष्ट करते हैं कि आपको कौन सी निर्भरताओं की आवश्यकता है, और यह मानते हुए कि आपके कॉन्फ़िगरेशन में उनके लिए बाइंडिंग है, एमवीसी उन्हें बनाने और नष्ट करने का ख्याल रखेगा आप। आप बस उनका इस्तेमाल करते हैं।
संपादित करें:
स्पष्ट है कि, मैं तुम्हें उदाहरण मैं ऊपर देने का उपयोग की सलाह नहीं देते। वे कैसे काम करता है के बारे में सिर्फ सरल चित्र हैं। विशेष रूप से, Get() वाक्यविन्यास को "सेवा स्थान" के रूप में जाना जाता है और इसे खराब माना जाता है। हालांकि, आखिरकार कुछ कोड, कहीं भी कॉल() को कॉल करना होगा, इसे सिर्फ ढांचे में गहरा दफनाया गया है।
जैसा कि एडम का उल्लेख है, सीधे डेटा इकाइयों के संदर्भ में बाध्यकारी एक अच्छा विचार नहीं है, और अंततः आपको इंटरफेस आधारित दृष्टिकोण का उपयोग करने के लिए आगे बढ़ना चाहिए।
धन्यवाद। मैंने नमूना डाउनलोड किया, लेकिन इसमें बहुत कुछ चल रहा है कि यह कहना मुश्किल है कि क्या कर रहा है।मैं समझता हूँ कि नहीं कैसे बाइंड अभी भी काम कर रहा है, लेकिन उस लाइन सब यह नियंत्रक के निर्माता संदर्भ देने के लिए ले जाता है हो रहा है। क्या आप किसी लेख या ट्यूटोरियल की अनुशंसा कर सकते हैं जो वास्तव में यहां क्या हो रहा है? –
Tyrsius
मैं 'http पर लिंक की जाँच होगी: निर्भरता इंजेक्शन के लिए सामान्य रूप में // ninject.org/learn', यह भी पुस्तक" .NET में निर्भरता इंजेक्शन "मार्क सीनैन – BrokenGlass