अभी हम डीआई/आईओसी का उपयोग करते हैं और जब हमें एक निर्माता को अतिरिक्त पैरामीटर पास करने की आवश्यकता होती है तो हम फैक्ट्री क्लास का उपयोग करते हैं।फैक्टरी कक्षाओं के भार लिखने से बचने के लिए कन्स्ट्रक्टर इंजेक्शन के बजाय सर्विसिकेलोकेशन का उपयोग करना बुरा है
public class EmailSender
{
internal EmailSender(string toEmail, string subject,String body, ILogger emailLogger)
{.....}
}
public class EmailSenderFactory
{
ILogger emailLogger;
public EmailSenderFactory(ILogger emailLogger)
{
this.emailLogger = emailLogger;
}
public EmailSender Create(string toEmail, string subject, string body)
{
return new EmailSender(toEmail, subject, body, emailLogger);
}
}
अब इस के साथ समस्या यह है कि हम एक पूरी lotta कारखाने कक्षाएं बनाने अंत है, और लोगों को हमेशा उन्हें इस्तेमाल करना नहीं आता (वे कभी कभी उन्हें खुद को नया)। इस तरह वर्ग कोडिंग की सबसे बड़ी नकारात्मक क्या हैं:
public class EmailSender
{
EmailLogger logger = IoC.Resolve<ILogger>();
internal EmailSender(string toEmail, string subject,String body)
{.....}
}
प्रो: अब हम एक कारखाने वर्ग कोन की जरूरत के बिना सुरक्षित रूप से निर्माता का उपयोग कर सकते: हम संदर्भ के लिए सेवा लोकेटर है (मैं के बारे में चिंतित नहीं हूँ टेस्टेबिलिटी, कंटेनर के लिए बैकिंग सेवा के रूप में एक नकली कंटेनर का उपयोग करना आसान है)।
क्या वहां कोई कारण है कि हमें ऐसा क्यों नहीं करना चाहिए?
संपादित करें: सोचा था की एक बिट के बाद, मैं twigged है कि एक निजी निर्माता होने से, और फैक्टरी वर्ग घोंसले बनाने के, मैं कार्यान्वयन और कारखाने एक साथ रह सके, और अनुचित तरीके से कक्षाएं बनाने से लोगों को रोकने, तो सवाल है कुछ हद तक मूक हो जाओ। SL गंदा होने के बारे में सभी बिंदुओं अंक, सच निश्चित रूप से कर रहे हैं, तो नीचे दिए गए समाधान मुझे खुश रखता है:
public class EmailSender
{
public class Factory
{
ILogger emailLogger;
public Factory(ILogger emailLogger)
{
this.emailLogger = emailLogger;
}
public EmailSender Create(string toEmail, string subject, string body)
{
return new EmailSender(toEmail, subject, body, emailLogger);
}
}
private EmailSender(string toEmail, string subject,String body, ILogger emailLogger)
{
}
}
संपादन पोस्ट करने के लिए धन्यवाद, मुझे इस विचार प्रक्रिया को बहुत उपयोगी लगता है क्योंकि मुझे एक ही चुनौतियों के माध्यम से लगता है। – rohancragg
यह एक उत्कृष्ट सवाल है, और एक जो मुझे नहीं लगता है वास्तव में नीचे सही ढंग से उत्तर दिया गया है। शायद मुझे कुछ याद आ रहा है, लेकिन मैंने केवल ऐसे समाधान देखे हैं जो केंद्रीय रूप से किए गए इंटरफेस को हल करने के समान ही अतिरिक्त कन्स्ट्रक्टर पैराम को केंद्रीय रूप से सेट करने की अनुमति देते हैं। ऊपर वर्णित एक के लिए यह एक बहुत ही अलग स्थिति है, जहां आप सामान्य रूप से पैरा के साथ सीटीआर का उपयोग करने में सक्षम होना चाहते हैं, लेकिन आईएलओगर ऑब्जेक्ट को डीकॉप्लिंग करने का लाभ भी लेना चाहते हैं। मैं केवल यह मान सकता हूं कि इस प्रकार का उपयोग ऐसे परिदृश्यों को सीटी के साथ DI के लिए अनुपयुक्त प्रदान करता है। – Xiaofu
मुझे इंप्रेशन मिल रहा है कि आईओसी का डीआई फॉर्म वास्तव में सच "सेवा घटकों" के लिए आरक्षित होना चाहिए, जिस तरह से आप इसे ऊपर करना चाहते हैं, उसमें कॉन्फ़िगरेशन की आवश्यकता नहीं है। ऐसा कहकर, मुझे अन्यथा दिखाए जाने से प्रसन्नता होगी! :) – Xiaofu