2010-11-01 16 views
10

से इंटरफेस को कार्यान्वित करते हैं, मैं Castle Windsor का उपयोग IoC container के रूप में करता हूं।कैसल विंडसर: एक असेंबली से ऑटो-रजिस्टर प्रकार जो

  • MyApp.Services.dll
    • IEmployeeService
    • IContractHoursService
    • ...
  • MyApp.ServicesImpl.dll : मैं एक संरचना निम्न के समान है कि एक आवेदन पत्र है
    • EmployeeService : MyApp.Services.IEmployeeService
    • ContractHoursService : MyApp.Services.IContractHoursService
    • ...

मैं इस समय XML configuration उपयोग करते हैं, और हर बार मैं एक नया IService/सेवा जोड़ी जोड़ने के लिए, मैं एक्सएमएल के लिए एक नया घटक जोड़ने के लिए विन्यास फाइल। मैं इसे सब fluent registration API पर स्विच करना चाहता हूं लेकिन मैंने अभी तक बिल्कुल सही काम करने के लिए सही नुस्खा नहीं किया है।

क्या कोई मदद कर सकता है? जीवन शैली सभी singleton होगी।

अग्रिम में बहुत धन्यवाद।

उत्तर

12

AllTypes साथ आप आसानी से ऐसा कर सकते हैं:

http://stw.castleproject.org/(S(nppam045y0sdncmbazr1ob55))/Windsor.Registering-components-by-conventions.ashx से:

पंजीयन घटक एक-एक करके बहुत दोहराव काम हो सकता है। आपके द्वारा जोड़े गए प्रत्येक नए प्रकार को पंजीकृत करने के लिए भी याद रखना जल्दी ही निराशा का कारण बन सकता है। सौभाग्य से, आपको कम से कम हमेशा ऐसा करने की ज़रूरत नहीं है। ऑल टाइप्स एंट्री क्लास का उपयोग करके आप निर्दिष्ट कुछ विशेषताओं के आधार पर प्रकार के समूह पंजीकरण कर सकते हैं।

मुझे लगता है कि जैसे अपने पंजीकरण दिखेगा:

AllTypes.FromAssembly(typeof(EmployeeService).Assembly) 
    .BasedOn<IEmployeeService>() 
    .LifeStyle.Singleton 

आप, एक आधार प्रकार लागू करते हैं तो IService अपने इंटरफेस पर की तरह, आप उन्हें एक बार निम्नलिखित निर्माण का उपयोग कर पर रजिस्टर कर सकते हैं:

AllTypes.FromAssembly(typeof(EmployeeService).Assembly) 
    .BasedOn<IService>() 
    .WithService.FromInterface() 
    .LifeStyle.Singleton 

अधिक उदाहरणों के लिए, आलेख देखें। संभावनाओं के बारे में इसका एक बहुत अच्छा विवरण है।

+0

यह मुझे 100% की आवश्यकता नहीं है, हालांकि मुझे आवश्यकता है। पहली असेंबली में विभिन्न सेवा इंटरफेस हैं, और मेरे पास एक ठोस उदाहरण के साथ एक-एक मैपिंग है। मुझे उपरोक्त कोड को बार-बार लिखना होगा क्योंकि मैं अब xml कॉन्फ़िगरेशन के लिए करता हूं। –

+0

क्या यह 'IEMployeeService' के लिए आधार इंटरफ़ेस रखने का विकल्प है? वही मैंने किया। आप उस इंटरफ़ेस को देखने के लिए विंडसर को बता सकते हैं, असेंबली के कार्यान्वयन के साथ नीचे सबकुछ पंजीकृत करें (इसलिए, विशेष रूप से 'IEMployeeService')। एक उदाहरण के साथ जवाब का विस्तार किया। –

+0

आपका मतलब है कि कोई आसान 'IService' नहीं है जिसके साथ कोई सदस्य नहीं है जो मार्कर इंटरफ़ेस के रूप में कार्य करता है? यह काम कर सकता था, मैं बस उम्मीद कर रहा था कि मैं इससे बच सकता हूं। :) –

3

मैं Pieter's answer आगे (, कुंजी किया जा रहा है के रूप में उन्होंने सुझाव दिया, AllTypes) बस एक छोटा सा ले लिया और इस के साथ आए हैं:

// Windsor 2.x 
container.Register(
    AllTypes.FromAssemblyNamed("MyApp.ServicesImpl") 
    .Where(type => type.IsPublic) 
    .WithService.FirstInterface() 
    ); 

यह MyApp.ServicesImpl.dll विधानसभा में सभी सार्वजनिक कक्षाओं के माध्यम से चला जाता है और प्रत्येक पंजीकृत करता है कंटेनर में पहले इंटरफ़ेस का उपयोग करके यह लागू होता है। क्योंकि मैं सेवा असेंबली में सभी कक्षाएं चाहता हूं, मुझे कोई मार्कर इंटरफ़ेस की आवश्यकता नहीं है।

उपरोक्त विंडसर के पुराने संस्करण के लिए काम करता है। नवीनतम संस्करण के लिए वर्तमान Castle Windsor documentation for registering components निम्न का सुझाव देता है:

// Windsor latest 
container.Register(
    AllTypes.FromAssemblyNamed("MyApp.ServicesImpl") 
    .Where(type => type.IsPublic) // Filtering on public isn't really necessary (see comments) but you could put additional filtering here 
    .WithService.DefaultInterface() 
    ); 
+0

आपको 'कहाँ (type => प्रकार की आवश्यकता नहीं है .IsPublic) '। विंडसर डिफ़ॉल्ट रूप से निर्यात किए गए प्रकारों (जिसका अर्थ है सार्वजनिक या घोंसला सार्वजनिक) को स्कैन करेगा। –

+0

मैंने सोचा कि, लेकिन मुझे लगता है कि आपको 'कहां (कुछ)' की आवश्यकता है, हालांकि 'WithService' विधि' FromAssembly नामांकित() 'के वापसी मूल्य पर नहीं है। ओह, जब तक कि मेरे पास #intellisensefail नहीं था ... मैं जांच करूंगा ... –

+0

मैंने अभी जांच की है, यह निश्चित रूप से मेरे लिए संकलित नहीं है। चूंकि मैं वर्तमान में विंडसर के पुराने संस्करण पर हूं, इसलिए मुझे लगता है कि यह नीचे है, और ऊपर दिए गए उत्तर को विंडसर के बारे में नवीनतम अपडेट करें। इनपुट के लिए बहुत बहुत धन्यवाद। :) –

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