मैं माफी माँगता हूँ अगर यह सवाल का एक और दोहराव लगता है, लेकिन हर बार जब मुझे इस विषय के बारे में एक लेख मिलता है, तो यह ज्यादातर डीआई के बारे में बात करता है। तो, मुझे DI मिलता है, लेकिन मैं एक IoC कंटेनर की आवश्यकता को समझने की कोशिश कर रहा हूं, जो हर किसी को मिल रहा है। क्या आईओसी कंटेनर की बात वास्तव में केवल निर्भरता के ठोस कार्यान्वयन को "ऑटो-रिज़ॉल्यूशन" करने के लिए है? हो सकता है कि मेरी कक्षाओं में कई निर्भरताएँ न हों और शायद इसीलिए मैं बड़ी बात नहीं देख रहा हूँ, लेकिन मैं यह सुनिश्चित करना चाहता हूँ कि मैं कंटेनर की उपयोगिता को ठीक से समझ रहा हूँ।
मैं आमतौर पर अपने व्यावसायिक तर्क को एक ऐसी कक्षा में तोड़ देता हूं जो कुछ इस तरह दिख सकती है:
public class SomeBusinessOperation
{
private readonly IDataRepository _repository;
public SomeBusinessOperation(IDataRespository repository = null)
{
_repository = repository ?? new ConcreteRepository();
}
public SomeType Run(SomeRequestType request)
{
// do work...
var results = _repository.GetThings(request);
return results;
}
}
तो यह केवल एक निर्भरता है, और कुछ मामलों में यह एक दूसरे या तीसरे हो सकता है, लेकिन यह सब अक्सर नहीं। तो कुछ भी जो इसे कहता है, वह स्वयं का रेपो पास कर सकता है या इसे डिफ़ॉल्ट रेपो का उपयोग करने की अनुमति दे सकता है।
जहां तक एक IoC कंटेनर की मेरी वर्तमान समझ है, सभी कंटेनर IDataRepository को हल करता है। लेकिन अगर यह सब ऐसा होता है, तो मैं इसमें एक टन का मूल्य नहीं देख रहा हूं क्योंकि मेरी परिचालन कक्षाएं पहले से ही एक कमबैक को परिभाषित करती हैं जब कोई योग्यता पारित नहीं हुई है। इसलिए केवल एक अन्य लाभ जो मैं सोच सकता हूं वह यह है कि अगर मेरे पास कई ऑपरेशन हैं जैसे यह उसी फ़ॉलबैक रेपो का उपयोग करता है, मैं उस रेपो को एक स्थान पर बदल सकता हूं जो रजिस्ट्री / फैक्टरी / कंटेनर है। और यह बहुत अच्छा है, लेकिन क्या ऐसा है?
ConcreteRepository
और (2) आप अतिरिक्त निर्भरता की आपूर्ति कर सकते हैं ( उदाहरण के लिए ConcreteRepository
एक डेटाबेस कनेक्शन सामान्य होगा)।