c# - Dependency injection - Place logic in the overloaded constructor? -


आज मुझे यह वर्ग मिल गया है:

  सार्वजनिक वर्ग SmtpEmailProvider: IMessageProvider {निजी रीडोनली SmtpClientWrapper _smtpClientWrapper; सार्वजनिक SmtpEmailProvider (SmtpClientWrapper smtpClientWrapper) {_smtpClientWrapper = smtpClientWrapper; }  

SmtpClient को नकली करने में सक्षम होने के लिए, मैंने इसे इस तरह लपेट कर रखा है:

  सार्वजनिक वर्ग SmtpClientWrapper {निजी रीडोनली SMTPClient _smtpClient; सार्वजनिक SmtpClientWrapper (SmtpClient smtpClient) {_smtpClient = smtpClient; } सार्वजनिक वर्चुअल शून्य भेजें (मेलमैसेज msg) {यदि (_smtpClient == नल) नया अमान्यऑपरेशन अपवाद फेंक ("कॉल करने से पहले SmtpClient को निर्माता को पास किया जाना चाहिए।"); _smtpClient.Send (एमएसजी); }}  

अभी मैं यह करने के लिए SmtpEmailProvider वर्ग शुरू करने के लिए, और वहाँ SmtpClient तर्क जगह कर सकते हैं:

  सार्वजनिक IMessageProvider LocateProviderByName (string providerName) { Var क्लाइंट = नया SmtpClient {होस्ट = "127.0.0.1", पोर्ट = 25}; Client.Credentials = नया नेटवर्क क्रेडेंशियल ("...", "..."); नया SmtpEmailProvider वापस करें (नया SmtpClientWrapper (क्लाइंट)); }  

लेकिन मैं इसे उस स्थान से बदलना चाहता हूं:

  सार्वजनिक IMessageProvider LocateProviderByName (string providerName) {IoC.Resolve & lt; IMessageProvider & gt; (providerName); }  

फिर मुझे कोई पैरामीटर नहीं के साथ कन्स्ट्रक्टर में तर्क रखना होगा। लेकिन मुझे ये महसूस हो रहा है कि मैं कंंट्रर में बहुत कुछ कर रहा हूं।

क्या ऐसा करने का कोई अन्य तरीका है?

मैं थोड़ा-बहुत उलझन में हूं कि आप वास्तव में क्या हासिल करने की कोशिश कर रहे हैं। अगर मुझे लगता है कि आपको एसएमटीपी ईमेलर्स प्रदान करने की आवश्यकता है, और आप आईओसी का उपयोग कर रहे हैं, तो आपको आईओसी ढांचे के साथ अपना संपूर्ण ऑब्जेक्ट ग्राफ़ तैयार करना चाहिए उसके द्वारा, मेरा मतलब है कि आप अपने आईओसी ढांचे को SMtpClient बनाने के लिए कॉन्फ़िगर करेंगे, जो इसे बाद में SmtpClientWrapper बनाता है, अंत में साथ SmtpEmailProvider बनाने। आपको SmtpEmailProvider कन्स्ट्रक्टर में कोई निर्भरता-निर्माण तर्क रखने की आवश्यकता नहीं है।

यहां आपके द्वारा प्रदान किए गए कोड के साथ कैसल विंडसर के साथ एक उदाहरण है:

  & lt; कॉन्फ़िगरेशन & gt ; & Lt; घटक आईडी = "smtpClient" प्रकार = "System.Net.Mail.SmtpClient, सिस्टम" & gt; & LT; मापदंडों & gt; & LT; होस्ट & gt; 127.0.0.1 & lt; / होस्ट & gt; & LT; पोर्ट & gt; 25 & lt; / पोर्ट & gt; & Lt; / मानकों & gt; & Lt; / घटक & gt; & Lt; घटक आईडी = "smtpClientWrapper" प्रकार = "Naespace.SmtpClientWrapper, विधानसभा" & gt; & LT; मापदंडों & gt; & LT; SmtpClient & gt; $ {SmtpClient} & lt; / SmtpClient & gt; & Lt; / मानकों & gt; & Lt; / घटक & gt; & Lt; घटक आईडी = "smtpProvider" सेवा = "नामस्थान। आईएमएसेजप्रदाता, विधानसभा" प्रकार = "नामस्थान। एसएमटीपी ईमेलप्राइवर, विधानसभा" & gt; & LT; मापदंडों & gt; & LT; smtpClientWrapper & gt; $ {smtpClientWrapper} & lt; / smtpClientWrapper & gt; & Lt; / मानकों & gt; & Lt; / घटक & gt; & Lt; / विन्यास & gt;  

उपरोक्त विंडसर कॉन्फ़िगरेशन के साथ, आप बस अपने IMessageProvider को इस प्रकार बना सकते हैं:

  सार्वजनिक IMessageProvider LocateProviderByName (स्ट्रिंग प्रदातानाम) {आईओसी रिवॉल्व & lt; IMessageProvider & gt ;(प्रदाता का नाम); } Var messageProvider = LocateProviderByName ("smtpProvider");  

यहां आईओसी कंटेनर का उपयोग करने के लिए मुख्य बिंदु यह है कि: निर्भरता सृजन और प्रबंधन प्रणाली जो आपके लिए पूर्ण ऑब्जेक्ट ग्राफ़ बना सकती हैं यह आपके द्वारा एक कन्स्ट्रक्टर में बहुत अधिक निर्भरता प्रबंधन तर्क के साथ समस्या को कम करता है।


Comments

Popular posts from this blog

c++ - Linux and clipboard -

What is expire header and how to achive them in ASP.NET and PHP? -

sql server - How can I determine which of my SQL 2005 statistics are unused? -