निर्भरता एक ऐसी वस्तु है जिस पर दूसरी वस्तु निर्भर करती है। निर्भरता इंजेक्शन (या उलटा) मूल रूप से उन वस्तुओं को प्रदान कर रहा है जिन्हें किसी वस्तु की आवश्यकता होती है, बजाय इसके कि वह स्वयं वस्तुओं का निर्माण करे। यह एक उपयोगी तकनीक है जो परीक्षण को आसान बनाती है, क्योंकि यह आपको निर्भरताओं का मजाक उड़ाने की अनुमति देती है।
उदाहरण के लिए, यदि कक्षा ए कक्षा बी पर एक विधि कहता है, जो बदले में कक्षा सी पर एक विधि कहता है, इसका मतलब है कि ए बी पर निर्भर करता है और बी सी पर निर्भर करता है। निर्भरता इंजेक्शन का उपयोग करके, हम कक्षा सी से कक्षा बी का एक उदाहरण पास कर सकते हैं , और बी और सी के उदाहरणों को बनाने के लिए इन वर्गों को रखने के बजाय बी से कक्षा ए का उदाहरण पास करें।
नीचे दिए गए उदाहरण में, क्लास रनर की क्लास लॉगर पर निर्भरता है। ध्यान दें कि रनर क्लास में कंस्ट्रक्टर में लकड़हारा का एक उदाहरण बनाता है। इस कोड में कुछ समस्याएं हैं।
-
यह लकड़हारा वर्ग को रनर से जोड़ता है और हम रनर को संशोधित किए बिना इसे अन्य वर्गों के साथ प्रतिस्थापित नहीं कर सकते।
-
अगर लकड़हारे की कोई निर्भरता है, तो लकड़हारे को तत्काल लकड़हारा करने से पहले उन्हें कॉन्फ़िगर करना होगा।
-
परीक्षण कठिन है। यदि लकड़हारा एक संसाधन-गहन वर्ग है, जैसे कि नेटवर्क या फ़ाइल सिस्टम तक पहुँच, तो यह परीक्षण को धीमा कर देगा। हम इसे आसानी से नहीं बदल सकते।
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); } }
निर्भरता इंजेक्शन का उपयोग करते हुए, हम एक ठोस वस्तु के बजाय एक इंटरफ़ेस ILogger को स्वीकार करने के लिए रनर के निर्माता को संशोधित करते हैं। ILogger को लागू करने के लिए हम लकड़हारा वर्ग को बदलते हैं। यह हमें रनर के कंस्ट्रक्टर को लकड़हारा वर्ग का एक उदाहरण पास करने की अनुमति देता है। इसका लाभ यह है कि परीक्षण के दौरान, हम एक टेस्टलॉगर क्लास बना सकते हैं जो ILogger को लागू करता है और उसे रनर के कंस्ट्रक्टर को पास करता है।
उदाहरण
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