कंस्ट्रक्टर इंजेक्शन का यह फायदा है कि यह निर्भरता को स्पष्ट करता है और क्लाइंट को एक उदाहरण प्रदान करने के लिए मजबूर करता है। यह भी गारंटी दे सकता है कि ग्राहक बाद में उदाहरण नहीं बदल सकता है। एक (संभव) नकारात्मक पक्ष यह है कि आपको अपने निर्माता के लिए एक पैरामीटर जोड़ना होगा।
सेटर इंजेक्शन का यह फायदा है कि इसे कंस्ट्रक्टर में किसी पैरामीटर को जोड़ने की आवश्यकता नहीं होती है। यह भी उदाहरण सेट करने के लिए ग्राहक की आवश्यकता नहीं है। यह वैकल्पिक निर्भरता के लिए उपयोगी है। यह तब भी उपयोगी हो सकता है यदि आप वर्ग बनाना चाहते हैं, उदाहरण के लिए, डिफ़ॉल्ट रूप से एक वास्तविक डेटा भंडार, और फिर एक परीक्षण में आप परीक्षण उदाहरण के साथ इसे बदलने के लिए सेटर का उपयोग कर सकते हैं।
इंटरफ़ेस इंजेक्शन , जहां तक मैं बता सकता हूं, सेटर इंजेक्शन से बहुत अलग नहीं है। दोनों मामलों में आप (वैकल्पिक रूप से) एक निर्भरता की स्थापना कर रहे हैं जिसे बाद में बदला जा सकता है।
अंतत: यह वरीयता का विषय है और निर्भरता की आवश्यकता है या नहीं । व्यक्तिगत रूप से, मैं कंस्ट्रक्टर इंजेक्शन का उपयोग लगभग विशेष रूप से करता हूं। मुझे पसंद है कि यह क्लाइंट को कंस्ट्रक्टर में एक उदाहरण प्रदान करने के लिए मजबूर करके एक वर्ग की निर्भरता को स्पष्ट करता है। मुझे यह भी पसंद है कि क्लाइंट तथ्य के बाद उदाहरण को बदल नहीं सकता है।
अक्सर बार, दो अलग-अलग कार्यान्वयन में पारित करने के लिए मेरा एकमात्र कारण परीक्षण के लिए है। उत्पादन में, मैं एक में पास हो सकता हूं DataRepository
, लेकिन परीक्षण में, मैं एक में गुजरता हूं FakeDataRepository
। इस मामले में मैं आमतौर पर दो निर्माणकर्ता प्रदान करूंगा: एक जिसमें कोई पैरामीटर नहीं है, और दूसरा जो स्वीकार करता है a IDataRepository
। फिर, बिना किसी पैरामीटर वाले कंस्ट्रक्टर में, मैं दूसरे कंस्ट्रक्टर को कॉल चेन करूंगा और पास करूंगा new DataRepository()
।
यहाँ C # में एक उदाहरण दिया गया है:
public class Foo
{
private readonly IDataRepository dataRepository;
public Foo() : this(new DataRepository())
{
}
public Foo(IDataRespository dataRepository)
{
this.dataRepository = dataRepository;
}
}
यह गरीब आदमी की निर्भरता इंजेक्शन के रूप में जाना जाता है। मुझे यह पसंद है क्योंकि उत्पादन ग्राहक कोड में, मुझे कई दोहराए गए बयानों को देखने की आवश्यकता नहीं है
var foo = new Foo(new DataRepository());
हालाँकि, मैं अभी भी परीक्षण के लिए एक वैकल्पिक कार्यान्वयन में पारित कर सकता हूं। मुझे एहसास है कि गरीब आदमी के डीआई के साथ मैं अपनी निर्भरता को हार्डकोड कर रहा हूं, लेकिन यह मेरे लिए स्वीकार्य है क्योंकि मैं ज्यादातर परीक्षण के लिए डीआई का उपयोग करता हूं।