2010-06-28 11 views
15

क्या यह एक इंटरफ़ेस निर्दिष्ट किए बिना विंडसर में घटकों को पंजीकृत करने के लिए खराब रूप माना जाता है? यानीक्या इंटरफ़ेस निर्दिष्ट किये बिना विंडसर में घटकों को पंजीकृत करना ठीक है?

container.Register(Component.For<MyClass>().LifeStyle.Transient); 

के विपरीत ...

container.Register(Component.For<IMyClass>().ImplementedBy<MyClass>().LifeStyle.Transient); 

मैं नहीं बल्कि एक ठोस कार्यान्वयन लेकिन हम पा रहे हैं अब हम इंटरफेस के बहुत सारे है कि तुलना में एक अंतरफलक के लिए कोडिंग के लाभों को समझने उनमें से कई उन वर्गों पर जो वास्तव में केवल एक कार्यान्वयन करेंगे।

उत्तर

23

हां, उनके इंटरफ़ेस के बिना घटकों को पंजीकृत करना ठीक होगा, लेकिन आपके द्वारा देने के कारण नहीं है।

कंक्रीट निर्भरता

यह हो सकता है कि घटक ठोस वर्ग पर निर्भर हैं। उदाहरण के लिए, एंटीटी फ्रेमवर्क उपभोक्ताओं के साथ ऑब्जेक्ट कॉन्टेक्स्ट इंजेक्शन होना चाहिए। यह एक ठोस वर्ग है जिसे अभी भी इंजेक्शन की आवश्यकता है क्योंकि यह कई उपभोक्ताओं के बीच साझा किया जाना चाहिए।

इस प्रकार, इस तरह एक उपभोक्ता के निर्माता दिया:

public FooRepository(FooObjectContext objectContext) 

आप इस तरह कंटेनर विन्यस्त करने की जरूरत होगी:

container.Register(Component.For<FooObjectContext>()); 

FooRepository अनुरोधों कोई इंटरफ़ेस तो यह कोई मतलब नहीं पंजीकरण बनाता है एक इंटरफ़ेस (भले ही कोई उपलब्ध था), लेकिन आपको अभी भी कंक्रीट क्लास पंजीकृत करना होगा क्योंकि विंडसर केवल स्पष्ट रूप से पंजीकृत को हल कर सकता है।

इंटरफेस केवल एक कार्यान्वयन

फिर साथ क्या केवल एक कार्यान्वयन के साथ इंटरफेस के बारे में? एक बार फिर, उपभोक्ता आवश्यकताओं का फैसला करता है।

कल्पना कीजिए एक उपभोक्ता इस निर्माता है:

public Ploeh(IBar bar) 

एक ही रास्ता महल विंडसर हल करने Ploeh है जब आप Ibar रजिस्टर में सक्षम हो जाएगा। यहां तक ​​कि अगर बार Ibar का ही कार्यान्वयन है, इस काम नहीं करेगा:

container.Register(Component.For<Bar>()); 

इसका कारण यह है Ibar पंजीकृत कभी नहीं है काम नहीं करता। कैसल विंडसर को परवाह नहीं है कि बार आईबीआर लागू करता है क्योंकि यह आपकी ओर से स्मार्ट होने की कोशिश नहीं करना चाहता है। आप यह स्पष्ट रूप से बताना होगा:

container.Register(Component.For<IBar>().ImplementedBy<Bar>()); 

यह नक्शे Ibar बार करने के लिए।

दोनों इंटरफेस और ठोस प्रकार

का पंजीयन तो क्या तुम दोनों ठोस प्रकार और इंटरफेस हल करने में सक्षम होना चाहते हैं?

पिछले उदाहरण के साथ समस्या यह है कि यह आपको आईबार को हल करने देगा, लेकिन बार नहीं। आप दोनों बार और Ibar हल

container.Register(Component.For<Bar, IBar>().ImplementedBy<Bar>()); 

यह कर सकते हैं:

आप पंजीकरण अग्रेषित करने के लिए आगे विधि, या के लिए की multigeneric अधिभार उपयोग कर सकते हैं।

+2

एक और अच्छा उदाहरण एमवीसी अनुप्रयोग में नियंत्रक होगा - आपको उन्हें सारण करने की आवश्यकता नहीं है। –

+0

हां, एमवीसी नियंत्रक एक बेहतर उदाहरण हैं - मुझे बस कुछ ईएफ कोड में फेंक दिया गया था, इसलिए यह मेरे दिमाग में पहले आया था :) –

+0

धन्यवाद मार्क लेकिन अगर मैं बार क्लास बनाने वाला डेवलपर हूं तो क्या मुझे इसे इंटरफ़ेस बनाना चाहिए इबार बस इतना है कि मैं इंटरफ़ेस के माध्यम से विंडसर में पंजीकरण कर सकता हूं? क्यों न केवल विंडसर में बार पंजीकृत करें और प्लोहे बार का उपभोग करें? –