Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C#

C# में डिपेंडेंसी इंजेक्शन समझाएं


एक निर्भरता एक ऑब्जेक्ट है जिस पर दूसरा ऑब्जेक्ट निर्भर करता है। डिपेंडेंसी इंजेक्शन (या इनवर्जन) मूल रूप से उन ऑब्जेक्ट्स को प्रदान करना है जिनकी एक ऑब्जेक्ट को आवश्यकता होती है, बजाय इसके कि वह उन्हें स्वयं बनाए। यह एक उपयोगी तकनीक है जो परीक्षण को आसान बनाती है, क्योंकि यह आपको निर्भरताओं को मॉक करने की अनुमति देती है।

उदाहरण के लिए, यदि क्लास 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
  1. C# में क्लास की अवधारणा समझाएं C# में क्लास की अवधारणा समझाएं

    क्लास C# में आवश्यक प्रकारों में से एक है। हम क्लास को समस्या डोमेन से संबंधित ऑब्जेक्ट्स के लिए ब्लूप्रिंट के रूप में सोच सकते हैं। यह एक टेम्पलेट है जिससे हम ऑब्जेक्ट्स बनाते हैं, उस संरचना और व्यवहार को परिभाषित करते हुए जो इस क्लास से बने ऑब्जेक्ट्स के सेट द्वारा साझा किया जाएगा। सरल शब्दों में,

  1. C# में Console क्लास C# में Console क्लास

    C# में Console क्लास का उपयोग कंसोल एप्लिकेशन के लिए मानक इनपुट, आउटपुट और त्रुटि स्ट्रीम को दर्शाने के लिए किया जाता है। आइए C# में Console क्लास प्रॉपर्टीज के कुछ उदाहरण देखते हैं: Console.CursorLeft प्रॉपर्टी C# में कंसोल का CursorLeft बदलने के लिए Console.CursorLeft प्रॉपर्टी का उपयोग करें। उदा

  1. - Ruby कोड को डिकॉपल करना: डेलीगेशन बनाम डिपेंडेंसी इंजेक्शन

    ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में, एक ऑब्जेक्ट अक्सर कार्य करने के लिए दूसरे ऑब्जेक्ट पर निर्भर करेगा। उदाहरण के लिए, यदि मैं फाइनेंस रिपोर्ट चलाने के लिए एक सिंपल क्लास बनाता हूँ: class FinanceReport def net_income FinanceApi.gross_income - FinanceApi.total_costs end end हम कह सकते हैं क