7

मुझे कुछ कोड विरासत में मिला है जिसमें क्लास प्रमाणीकरण प्रबंधक सभी स्थिर तरीकों के साथ है।निर्भरता इंजेक्शन का उपयोग करने के लिए आप स्थैतिक कक्षाओं को कैसे दोहराते हैं?

इम डि शुरू करने और एक निर्माता है कि एक निर्भरता UserController

UserController _userController; 

public AuthenticationManager(UserController userCont) 
{ 
    _userController = userCont; 
} 

अब इम ले लिया संकलन समय त्रुटि मिल रही है के रूप में एक गैर स्थैतिक चर एक स्थिर विधि से संदर्भित है जोड़ना चाहते थे। इस कक्षा और कॉलिंग कोड में न्यूनतम परिवर्तनों के साथ काम करने के लिए यह आपके सर्वोत्तम अभ्यास की सिफारिश क्या होगी?

हम आईओसी कंटेनर के रूप में SimpleServiceLocator का उपयोग कर रहे हैं।

+0

क्या यह [सरल इंजेक्टर] (http://simpleinjector.codeplex.com) में अपग्रेड करने का समय नहीं होगा? मैंने सरल सेवा लोकेटर को विकसित करना बंद कर दिया। – Steven

+0

टिप के लिए धन्यवाद - मुझे पता नहीं था कि सरल इंजेक्टर मौजूद था! क्या सरल इंजेक्टर अतिरिक्त कार्यक्षमता प्रदान करता है जो मेरे प्रश्न को संबोधित करता है या यह सिर्फ एक अच्छी बात है? –

+0

यह आपके प्रश्न का समाधान नहीं करता है, लेकिन सरल इंजेक्टर तेज, क्लीनर है, और एक्सटेंशन जोड़ने के लिए बहुत बेहतर समर्थन है (यहां वर्णित उन्नत परिदृश्यों में से अधिकांश (http://simpleinjector.codeplex.com/wikipage?title = उन्नत-परिदृश्य और संदर्भण टाइटल = दस्तावेज़ीकरण) एसएसएल के साथ कार्यान्वित करना संभव नहीं है)। आप मूल अंतर एसआई एसएसएल [यहां] (http://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=87) के बारे में पढ़ सकते हैं। – Steven

उत्तर

9

वैसे यह इस बात पर निर्भर करता है कि कक्षा में कक्षा का कितनी बार उपयोग किया जाता है। आप शायद IAuthenticationManager इंटरफ़ेस बनाना चाहते हैं जिसमें विधियों को शामिल किया गया है जो स्थिर विधियों से मेल खाते हैं जिन्हें आप उदाहरण विधियों के साथ प्रतिस्थापित करना चाहते हैं। फिर आप AuthenticationManager कक्षा बना सकते हैं जो इंटरफ़ेस लागू करता है, और UserController निर्भरता को इसके कन्स्ट्रक्टर के माध्यम से स्वीकार करता है।

आपको फिर सभी विधियों विधि कॉल-साइट्स को इंस्टेंस विधियों को प्रतिस्थापित करने की आवश्यकता होगी। आप शायद एक निर्माता या संपत्ति के माध्यम से कक्षाओं में IAuthenticationManager इंजेक्ट करना चाहते हैं। यदि आवश्यकता हो, तो आप पैरामीटर के रूप में विधियों (कॉल-साइट्स पर) IAuthenticationManager पास कर सकते हैं।

दुर्भाग्य से स्थैतिक तरीकों को प्रतिस्थापित करने से काफी कुछ रिफैक्टरिंग होती है। हालांकि यह प्रयास के लायक है। यह इकाई परीक्षण के लिए दरवाजा खोलता है।

ध्यान रखें कि आप एक समय में एक विधि को एक स्थिर तरीके से एक इंटरफेस निकालने के द्वारा हमेशा एक विधि को दोबारा कर सकते हैं। अपने रीफैक्टरिंग के लिए चरण-दर-चरण दृष्टिकोण लेने के लिए प्रत्येक विधि को एक-एक करके करें (दूसरे शब्दों में, प्रत्येक विधि का अपना इंटरफ़ेस मिलता है)।

यदि आप यह कर सकते हैं तो मैं इस पुस्तक को देखने की सलाह दूंगा: Working Effectively With Legacy Code। महान किताब जो इस तरह की सभी तरह की स्थिति को कवर करती है।

संबंधित मुद्दे