मैं कोई विशेषज्ञ नहीं हूं, लेकिन मुझे लगता है कि मैं मदद कर सकता हूं। और हाँ, यह एक विशिष्ट प्रकार की निर्भरता इंजेक्शन है।
डिस्क्लेमर: लगभग यह सब निनजेक्ट विकी से "चुराया" गया था
आइए एक सरल उदाहरण के माध्यम से चलकर निर्भरता इंजेक्शन के विचार की जांच करें। मान लीजिए कि आप अगला ब्लॉकबस्टर गेम लिख रहे हैं, जहां महान योद्धा महान गौरव की लड़ाई करते हैं। सबसे पहले, हमें अपने योद्धाओं को हथियार बनाने के लिए उपयुक्त हथियार की आवश्यकता होगी।
class Sword
{
public void Hit(string target)
{
Console.WriteLine("Chopped {0} clean in half", target);
}
}
फिर, चलिए अपने योद्धाओं का प्रतिनिधित्व करने के लिए एक वर्ग बनाते हैं। अपने दुश्मनों पर हमला करने के लिए, योद्धा को एक हमले () विधि की आवश्यकता होगी। जब इस विधि को कॉल किया जाता है, तो उसे अपने प्रतिद्वंद्वी पर प्रहार करने के लिए अपने स्वॉर्ड का उपयोग करना चाहिए।
class Samurai
{
readonly Sword sword;
public Samurai()
{
this.sword = new Sword();
}
public void Attack(string target)
{
this.sword.Hit(target);
}
}
अब, हम अपने समुराई बना सकते हैं और लड़ाई कर सकते हैं!
class Program
{
public static void Main()
{
var warrior = new Samurai();
warrior.Attack("the evildoers");
}
}
जैसा कि आप कल्पना कर सकते हैं, यह कटा हुआ एवोल्यूशनर्स को कंसोल में आधे हिस्से में साफ करेगा । यह ठीक काम करता है, लेकिन क्या होगा अगर हम अपने समुराई को दूसरे हथियार से लैस करना चाहते हैं? चूंकि तलवार समुराई वर्ग के निर्माता के अंदर बनाई गई है, इसलिए हमें इस बदलाव को करने के लिए कक्षा के कार्यान्वयन को संशोधित करना होगा।
जब कोई वर्ग ठोस निर्भरता पर निर्भर होता है, तो उसे उस वर्ग के साथ कसकर जोड़ा जाता है । इस उदाहरण में, समुराई वर्ग को बहुत हद तक तलवार वर्ग से जोड़ा गया है। जब कक्षाओं को कसकर युग्मित किया जाता है, तो उन्हें उनके कार्यान्वयन में बदलाव किए बिना इंटरचेंज नहीं किया जा सकता है। कसकर युग्मन वर्गों से बचने के लिए, हम अप्रत्यक्ष स्तर प्रदान करने के लिए इंटरफेस का उपयोग कर सकते हैं। आइए हमारे खेल में एक हथियार का प्रतिनिधित्व करने के लिए एक इंटरफ़ेस बनाएं।
interface IWeapon
{
void Hit(string target);
}
फिर, हमारा Sword वर्ग इस इंटरफ़ेस को लागू कर सकता है:
class Sword : IWeapon
{
public void Hit(string target)
{
Console.WriteLine("Chopped {0} clean in half", target);
}
}
और हम अपने समुराई वर्ग को बदल सकते हैं:
class Samurai
{
readonly IWeapon weapon;
public Samurai()
{
this.weapon = new Sword();
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}
अब हमारा समुराई विभिन्न हथियारों से लैस हो सकता है। लेकिन रुकें! तलवार अभी भी समुराई के निर्माता के अंदर बनाई गई है। चूँकि हमें अभी भी अपने योद्धा को एक और हथियार देने के लिए समुराई के कार्यान्वयन में फेरबदल करने की आवश्यकता है, इसलिए समुराई अभी भी तलवार को कस कर पकड़े हुए है।
सौभाग्य से, एक आसान उपाय है। समुराई के निर्माणकर्ता के भीतर से तलवार बनाने के बजाय, हम इसे निर्माणकर्ता के पैरामीटर के रूप में उजागर कर सकते हैं। कंस्ट्रक्टर इंजेक्शन के रूप में भी जाना जाता है।
class Samurai
{
readonly IWeapon weapon;
public Samurai(IWeapon weapon)
{
this.weapon = weapon;
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}
जैसा कि जियोर्जियो ने बताया, संपत्ति इंजेक्शन भी है। यह कुछ इस तरह होगा:
class Samurai
{
IWeapon weapon;
public Samurai() { }
public void SetWeapon(IWeapon weapon)
{
this.weapon = weapon;
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}
उम्मीद है की यह मदद करेगा।