2011-06-05 10 views
8

कैसल विंडसर एक कॉन्फ़िगरेशन फ़ाइल में एक्सएमएल का उपयोग करने के विकल्प के रूप में घटकों को पंजीकृत करने के लिए एक फ्लुएंट इंटरफ़ेस के साथ आया था। जेनेरिक इंटरफ़ेस पंजीकृत करने के लिए मैं इस फ़्लुएंट इंटरफ़ेस का उपयोग कैसे करूं?आप जेनेरिक इंटरफेस पंजीकृत करने के लिए कैसल विंडसर - फ्लुएंट इंटरफेस का उपयोग कैसे करते हैं?

समझाने के लिए, मेरे पास है:

public interface IFoo<T,U> 
{  
    public T IToo(); 
    public U ISeeU(); 
} 

कौन सा कुछ वर्ग फू बुलाया द्वारा कार्यान्वित किया जाता। अब, अगर मैं इस पंजीकृत करना चाहते हैं, मैं कुछ पसंद है ...

var _container = new WindsorContainer(); 
_container.Register(...); 

मैं इस के साथ पंजीयन में कैसे आगे बढ़ना करते हैं? गैर-जेनेरिक इंटरफेस करने की प्रक्रिया काम नहीं करती है।

उत्तर

15

इस तरह से दिख रहा है?

container.Register(AllTypes.FromAssemblyContaining<YourClass>() 
     .BasedOn(typeof(IFoo<,>)) 
     .WithService.AllInterfaces() 
     .Configure(c => c.LifeStyle.Transient)); 

इंटरफ़ेस

public interface IFoo<T, U> 
{ 
    T IToo(); 
    U ISeeU(); 
} 
+0

आपके उत्तर के लिए धन्यवाद। "EventRepository" क्या है? – Phil

+0

@ फिल: कुछ कक्षा। आप अपना खुद का प्रश्न/इंस्टॉलर लिख सकते हैं। –

+0

पोस्ट अपडेट किया गया! – danyolgiax

4

यह है कि क्या आप खुले सामान्य IFoo<T,U> इंटरफ़ेस एक या अधिक कार्यान्वयन कि प्रत्येक कि इंटरफेस (बैच पंजीकरण) की एक बंद संस्करण को लागू मैप करने की आवश्यकता अपने प्रश्न में यह स्पष्ट नहीं है या आप ओपन जेनेरिक इंटरफ़ेस को खुले जेनेरिक कार्यान्वयन में मैप करना चाहते हैं।

डैनियलगियाक्स ने बैच पंजीकरण का एक उदाहरण दिया। खुले जेनेरिक कार्यान्वयन के लिए एक खुले जेनेरिक इंटरफ़ेस को मैप करना, आपको उस इंटरफ़ेस के एक बंद संस्करण का अनुरोध करने और निर्दिष्ट कार्यान्वयन का एक बंद संस्करण लौटने की क्षमता देता है। एक खुला सामान्य प्रकार के मानचित्रण के लिए पंजीकरण आम तौर पर इस प्रकार दिखाई देगा:

var foo1 = container.Resolve<IFoo<int, double>>(); 
object foo2 = container.Resolve(typeof(IFoo<string, object>)); 

आप देख सकते हैं कर सकते हैं, आप खुले के किसी भी बंद संस्करण को हल कर सकते हैं:

container.Register(Component 
    .For(typeof(IFoo<,>)) 
    .ImplementedBy(typeof(Foo<,>))); 

आप इस इस प्रकार हल कर सकते हैं सामान्य इंटरफ़ेस।

+0

अच्छा बिंदु। मैं किसी भी समाधान की तलाश में था; मुझे बस इसे काम करने की ज़रूरत है। विचार यह है कि इसे अब काम करना और बाद में आवश्यकता होने पर संशोधित करना है। यही कारण है कि मैंने दृष्टिकोण को खुला छोड़ दिया। हालांकि अंतर्दृष्टि के लिए धन्यवाद। – Phil

+0

कृपया, मुझे एक उदाहरण दिखाएं कि इसे विंडसर के माध्यम से कैसे हल करें। जब मैं कोशिश करता हूं, तो मुद्दा यह है कि फू स्वयं सामान्य नहीं है, इसलिए मुझे इस तरह का अपवाद मिलता है।> सिस्टम। इन्वाइडऑपरेशन अपवाद: Fooing.Foo जेनेरिक टाइप टाइप नहीं है। MakeGenericType को केवल उस प्रकार पर बुलाया जा सकता है जिसके लिए Type.IsGenericTypeDefinition सत्य है। – Phil

+0

@ फिल: मेरा अपडेट देखें। – Steven

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