मार्क सीमान इसे सही मिला। और मैं आपके भ्रम के साथ सहानुभूति व्यक्त करता हूं। जब मैंने स्वचालित निर्भरता इंजेक्शन कंटेनरों का उपयोग करना सीखा तो मैं इसे अपने आप से चला गया। समस्या यह है कि वस्तुओं को डिजाइन और उपयोग करने के कई वैध और उचित तरीके हैं। फिर भी उनमें से कुछ दृष्टिकोण स्वचालित निर्भरता इंजेक्शनोर कंटेनर के साथ काम करते हैं।
मेरा व्यक्तिगत इतिहास: मैंने ऑब्जेक्ट निर्माण और नियंत्रण में उलझन के सिद्धांतों को सीखा है इससे पहले कि मैंने एकता या कैसल विंडसर कंटेनर जैसे नियंत्रण कंटेनरों में उलटा उपयोग करने के बारे में सीखा। मैंने इस तरह के कोड लिखने की आदत हासिल की:
public class Foo
{
IService _service;
int _accountNumber;
public Foo(IService service, int accountNumber)
{
_service = service;
_accountNumber = accountNumber;
}
public void SaveAccount()
{
_service.Save(_accountNumber);
}
}
public class Program
{
public static void Main()
{
Foo foo = new Foo(new Service(),1234);
foo.Save();
}
}
इस डिज़ाइन में, मेरा Foo क्लास डेटाबेस में खातों को सहेजने के लिए ज़िम्मेदार है। ऐसा करने के लिए इसे एक खाता संख्या और गंदे काम करने की सेवा की आवश्यकता है। यह कुछ हद तक ऊपर दिए गए कंक्रीट वाले वर्गों के समान है, जहां प्रत्येक ऑब्जेक्ट कन्स्ट्रक्टर में कुछ अद्वितीय मान लेता है। यह ठीक काम करता है जब आप ऑब्जेक्ट को अपने कोड से तुरंत चालू करते हैं। आप सही समय पर उचित मूल्यों में गुजर सकते हैं।
हालांकि, जब मैंने स्वचालित निर्भरता इंजेक्शन कंटेनरों के बारे में सीखा, तो मैंने पाया कि मैं अब हाथ से फू को तत्काल नहीं कर रहा था। कंटेनर मेरे लिए कन्स्ट्रक्टर तर्कों को तुरंत चालू करेगा। यह आईएसईसी जैसी सेवाओं के लिए एक बड़ी सुविधा थी। लेकिन यह स्पष्ट रूप से पूर्णांक और तारों और इसी तरह के लिए इतना अच्छा काम नहीं करता है। उन मामलों में, यह एक डिफ़ॉल्ट मान प्रदान करेगा (जैसे एक पूर्णांक के लिए शून्य)।इसके बजाय, मैं खाता संख्या, नाम, आदि जैसे संदर्भ-विशिष्ट मान में गुजर के आदी किया गया था ... तो मैं इस तरह होने के लिए कोडिंग और डिजाइन की मेरी शैली को समायोजित करने के लिए किया था:
public class Foo
{
IService _service;
public Foo(IService service)
{
_service = service;
}
public void SaveAccount(int accountNumber)
{
_service.Save(accountNumber);
}
}
public class Program
{
public static void Main()
{
Foo foo = new Foo(new Service());
foo.Save(1234);
}
}
यह दोनों दिखाई देने वाले फू कक्षाएं वैध डिजाइन हैं। लेकिन दूसरा स्वचालित निर्भरता इंजेक्शन के साथ प्रयोग योग्य है, और पहला नहीं है।
स्रोत
2010-09-04 11:41:12
हार्डकोडिंग की बजाय कॉन्फ़िगरेशन फ़ाइल में इन्हें स्टोर करना संभव कैसे होगा? –