दोनों पैटर्न नियंत्रण के व्युत्क्रम के सिद्धांत के कार्यान्वयन की तरह लगते हैं। यही है, कि एक वस्तु को यह नहीं पता होना चाहिए कि इसकी निर्भरता का निर्माण कैसे किया जाए।
निर्भरता इंजेक्शन (DI) एक निर्माता या सेटर का उपयोग करने के लिए लगता है कि यह "निर्भरता" है।
कंस्ट्रक्टर इंजेक्शन का उपयोग करने का उदाहरण:
//Foo Needs an IBar
public class Foo
{
private IBar bar;
public Foo(IBar bar)
{
this.bar = bar;
}
//...
}
सेवा लोकेटर एक "कंटेनर" का उपयोग करता है, जो इसकी निर्भरता को बढ़ाता है और फू इट्स बार देता है।
सेवा लोकेटर का उपयोग करने का उदाहरण:
//Foo Needs an IBar
public class Foo
{
private IBar bar;
public Foo()
{
this.bar = Container.Get<IBar>();
}
//...
}
क्योंकि हमारी निर्भरताएं केवल वस्तुएं हैं, इन निर्भरताओं में निर्भरताएं हैं, जिनकी और भी अधिक निर्भरताएं हैं, और इसी तरह आगे भी। इस प्रकार, कंट्रोल कंटेनर (या DI कंटेनर) का उलटा पैदा हुआ था। उदाहरण: कैसल विंडसर, निनजेक्ट, स्ट्रक्चर मैप, स्प्रिंग, आदि)
लेकिन एक IOC / DI कंटेनर बिल्कुल सर्विस लोकेटर की तरह दिखता है । क्या इसे डीआई कंटेनर एक बुरा नाम कह रहा है? क्या IOC / DI कंटेनर सिर्फ दूसरे प्रकार का सर्विस लोकेटर है? क्या इस तथ्य में अति सूक्ष्म अंतर है कि हम डीआई कंटेनरों का उपयोग तब करते हैं जब हमारे पास कई निर्भरताएं होती हैं?