एक निर्भरता एक ऑब्जेक्ट है जिस पर दूसरा ऑब्जेक्ट निर्भर करता है। डिपेंडेंसी इंजेक्शन (या इनवर्जन) मूल रूप से उन ऑब्जेक्ट्स को प्रदान करना है जिनकी एक ऑब्जेक्ट को आवश्यकता होती है, बजाय इसके कि वह उन्हें स्वयं बनाए। यह एक उपयोगी तकनीक है जो परीक्षण को आसान बनाती है, क्योंकि यह आपको निर्भरताओं को मॉक करने की अनुमति देती है।
उदाहरण के लिए, यदि क्लास A क्लास B पर एक विधि को कॉल करती है, जो बदले में क्लास C पर एक विधि को कॉल करती है, तो इसका मतलब है कि A, B पर निर्भर करती है और B, C पर निर्भर करती है। डिपेंडेंसी इंजेक्शन का उपयोग करके, हम क्लास C का एक इंस्टेंस क्लास B को पास कर सकते हैं, और क्लास B का एक इंस्टेंस क्लास A को पास कर सकते हैं, बजाय इसके कि ये क्लासेस B और C के इंस्टेंस स्वयं बनाएं।
नीचे दिए गए उदाहरण में, क्लास Runner की क्लास Logger पर निर्भरता है। ध्यान दें कि क्लास Runner कंस्ट्रक्टर में Logger का एक इंस्टेंस बनाती है। इस कोड में कुछ समस्याएं हैं।
यह लॉगर क्लास को Runner से बांधता है और हम Runner को संशोधित किए बिना इसे अन्य क्लासेस से प्रतिस्थापित नहीं कर सकते।
यदि Logger की कोई निर्भरता है, तो Worker को Logger को इंस्टेंशिएट करने से पहले उन्हें कॉन्फ़िगर करना होगा।
परीक्षण कठिन है। यदि Logger एक संसाधन-गहन क्लास है, जैसे नेटवर्क या फाइल सिस्टम तक पहुंचना, तो यह परीक्षण को धीमा कर देगा। हम इसे आसानी से प्रतिस्थापित नहीं कर सकते।
using System; class Program{ static void Main(string[] args){ var runner = new Runner(); runner.Run(); } } class Runner{ private Logger _logger; public Runner(){ _logger = new Logger(); } public void Run(){ // Do some work _logger.Log("Message to be logged"); } } class Logger{ public void Log(string message){ Console.WriteLine(message); } }डिपेंडेंसी इंजेक्शन का उपयोग करके, हम Runner के कंस्ट्रक्टर को एक ठोस ऑब्जेक्ट के बजाय एक इंटरफ़ेस ILogger स्वीकार करने के लिए संशोधित करते हैं। हम Logger क्लास को ILogger लागू करने के लिए बदलते हैं। यह हमें Logger क्लास के इंस्टेंस को Runner के कंस्ट्रक्टर में पास करने की अनुमति देता है। इसका लाभ यह है कि परीक्षण के दौरान, हम एक TestLogger क्लास बना सकते हैं जो ILogger को लागू करता है और उसे Runner के कंस्ट्रक्टर में पास कर सकते हैं।
उदाहरण
using System; class Program{ static void Main(string[] args){ var logger = new Logger(); var runner = new Runner(logger); runner.Run(); } } class Runner{ private ILogger _logger; public Runner(ILogger logger){ _logger = logger; } public void Run(){ // Do some work _logger.Log("Message to be logged"); } } interface ILogger{ void Log(string message); } class Logger : ILogger{ public void Log(string message){ Console.WriteLine(message); } }आउटपुट
Message to be logged