Design patterns
निर्भरता अन्तःक्षेपण
खोज…
परिचय
डिपेंडेंसी इंजेक्शन के पीछे सामान्य विचार यह है कि आप डिपेंडेंसी इनवर्जन प्रिंसिपल का पालन करते हुए शिथिल युग्मित घटकों के आसपास अपने आवेदन को डिज़ाइन करते हैं। कंक्रीट कार्यान्वयन के आधार पर नहीं, अत्यधिक लचीली प्रणालियों को डिजाइन करने की अनुमति देता है।
टिप्पणियों
निर्भरता इंजेक्शन के पीछे मूल विचार अधिक शिथिल युग्मित कोड बनाना है। जब कोई वर्ग, अपनी निर्भरता को नया करने के बजाय, अपनी निर्भरता में लेता है, तो कक्षा एक इकाई ( इकाई परीक्षण ) के रूप में परीक्षण करने के लिए अधिक सरल हो जाती है।
ढीले युग्मन पर और विस्तार करने के लिए - विचार यह है कि कक्षाएं समवर्ती पर निर्भर हो जाती हैं, बजाय सहमति के। यदि क्लास A
दूसरे ठोस वर्ग B
पर निर्भर करता है, तो A
बिना B
का वास्तविक परीक्षण नहीं होता है। हालांकि इस प्रकार का परीक्षण ठीक हो सकता है, यह इकाई परीक्षण योग्य कोड के लिए उधार नहीं देता है। शिथिल युग्मित डिज़ाइन एक एब्स्ट्रैक्शन IB
(उदाहरण के रूप में) को परिभाषित करेगा जो क्लास A
पर निर्भर करेगा। इसके बाद IB
को परीक्षण योग्य व्यवहार प्रदान करने के लिए मज़ाक किया जा सकता है, बजाय इसके कि B
के वास्तविक क्रियान्वयन पर भरोसा करने के बजाय A
को परीक्षण योग्य परिदृश्य प्रदान करने में सक्षम होना चाहिए।
कसकर युग्मित उदाहरण (C #):
public class A
{
public void DoStuff()
{
B b = new B();
b.Foo();
}
}
उपरोक्त में, क्लास A
B
पर निर्भर करता है। कोई परीक्षण नहीं है A
ठोस बिना B
। हालांकि यह एक एकीकरण परीक्षण परिदृश्य में ठीक है, इकाई A
लिए परीक्षण करना मुश्किल है।
ऊपर का एक अधिक शिथिल युग्मित कार्यान्वयन इस तरह दिख सकता है:
public interface IB
{
void Foo();
}
public class A
{
private readonly IB _iB;
public A(IB iB)
{
_iB = iB;
}
public void DoStuff()
{
_b.Foo();
}
}
दोनों कार्यान्वयन काफी समान हैं, हालांकि एक महत्वपूर्ण अंतर है। क्लास A
अब सीधे क्लास B
पर निर्भर नहीं है, यह अब IB
पर निर्भर है। क्लास A
पास अब अपनी खुद की डिपेंडेंसी को नया करने की जिम्मेदारी नहीं है - उन्हें अब A
को प्रदान किया जाना चाहिए।
सेटर इंजेक्शन (C #)
public class Foo
{
private IBar _iBar;
public IBar iBar { set { _iBar = value; } }
public void DoStuff()
{
_iBar.DoSomething();
}
}
public interface IBar
{
void DoSomething();
}
कंस्ट्रक्टर इंजेक्शन (C #)
public class Foo
{
private readonly IBar _iBar;
public Foo(IBar iBar)
{
_iBar = iBar;
}
public void DoStuff()
{
_bar.DoSomething();
}
}
public interface IBar
{
void DoSomething();
}