2008-10-15 12 views
5

से गुणों को पढ़ने/हल करने के लिए कैसे करें मेरे पास बहुत सारे महल xml कॉन्फ़िगरेशन हैं जहां कनेक्शनस्ट्रिंग जैसी गुण .NET कॉन्फ़िगरेशन अनुभागों के अंतर्गत भी हैं।कैसल विंडसर कॉन्फ़िगरेशन

मैं कंटेनर का उपयोग गुण को पढ़ने के लिए सक्षम होने के लिए चाहते हैं, लेकिन यह करने के लिए एक तंत्र नहीं देख सकता। यानी

<castle> 
    <configuration> 
    <properties> 
     <connectionString>Data Source=MyServer;Initial Catalog=YadaYada;User  ID=me;Password=IAmGod</connectionString> 
    </properties> 
    <components> 

...

जाहिर गुण के रूप में वहाँ उन पर घटक निर्भरता हैं देखते हैं। मैं घटकों को हल कर सकता हूं लेकिन गुण नहीं।

ज़रूर मैं एक घटक नए सकता है सिर्फ संपत्ति महल यह इंजेक्शन बाहर पढ़ने के लिए, या मैं नाम/वैल जोड़े धारण करने के लिए बस विशेष एक घटक के सारे गुण लपेट सकता है। लेकिन मैंने सोचा होगा कि एक साधारण कंटेनर होगा .resolve ("property.connectionstring") नोटेशन।

* मार्कडाउन के साथ बहुत अच्छा संपादित नहीं करें, ऊपर एक एक्सएमएल अनुभाग होना था।

+0

[विंडसर का उपयोग करके इंजेक्ट ऐप सेटिंग्स का संभावित डुप्लिकेट] (http://stackoverflow.com/questions/244935/inject-app-settings-using-windsor) –

उत्तर

1

क्या आप इस गलत तरीके से सोच रहे हैं?

निश्चित रूप से उद्देश्य यह है कि कनेक्शन स्ट्रिंग उपयोग कर रहा है निर्माता में एक ConnectionString गुण और निर्भरता में की तरह config के घटकों खंड में कुछ के साथ वहाँ धक्का दिया होना चाहिए:

<component type="SessionManager"> 
    <parameters> 
    <connectionString>#{connectionString}</connectionString> 
    </parameters> 
</component> 

इस तरह कनेक्शन स्ट्रिंग होगा स्वचालित रूप से पारित किया जाएगा और आपके घटक को कंटेनर के बारे में जानने की आवश्यकता नहीं होगी - decoupled और एकजुट !!!

+1

नहीं। मेरे घटक सभी निर्भरता का उपयोग करते हैं जैसे आपने पोस्ट किया है । लेकिन मैं कोड में कॉन्फ़िगरेशन फ़ाइल में परिभाषित गुणों को सीधे एक्सेस करना चाहता हूं, जैसा कि आप My.Setting.ConnectionString yada yada के साथ करेंगे, यदि आप वेनिला .NET कॉन्फ़िगरेशन शैली –

2

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

एक और विकल्प मौजूदा कॉन्फ़िगरेशन दुभाषिया को लेना और कॉन्फ़िगरेशन को पार्स करते समय एकत्र किए गए गुणों का खुलासा करना होगा - इन पर जाने के लिए थोड़ा सा काम होगा (लेकिन बहुत ज्यादा नहीं) .. मुझे लगता है कि आप कर सकते हैं

  • एक डेकोरेटर को लागू करने IXmlProcessorEngine है कि यह के अपने निजी शब्दकोश में AddProperty (XmlElement तत्व) के लिए कॉल और दुकानों तत्वों कब्जा बनाना: करके करते हैं।
  • अपने स्वयं के कार्यान्वयन के साथ XmlProcessor बदलें (यानी वर्ग के लिए स्रोत कोड कॉपी कर उन्हें निर्माता बदल ताकि आप, DefaultXmlProcessorEngine उदाहरण है, जिसमें वास्तविक काम कर रही है चारों ओर डेकोरेटर लपेट तो विभिन्न ऐड-संपत्ति कॉल रिकॉर्ड किए जाते हैं) ।
  • XmlInterpreter से इनहेरिट और ProcessResource विधि को ओवरराइड करें ताकि यह आपके XmlProcessor प्रतिस्थापन को कॉल कर सके।
  • तय करें कि आप संपत्तियों पर पाने के लिए अपने डेकोरेटर द्वारा संग्रहीत किया जा रहा चाहते हैं, शायद यह एक शब्दकोश है कि XmlInterpreter और बदले में XmlProcessor से निर्माता के माध्यम से में पारित के साथ कॉन्फ़िगर किया गया है ..

दुर्भाग्य से AFAIK उन गुणों विन्यास दुकान को भेजी जाती हैं नहीं है, क्योंकि वे केवल व्याख्या चरण के दौरान इस्तेमाल कर रहे हैं - प्लस मैं नहीं मानता प्रकार कन्वर्टर्स पार्स के इस स्तर पर लागू किया जाता है, इसलिए मूल्य तार होंगे, लेकिन कम से कम if/else आदि शर्त कथन का मूल्यांकन सही ढंग से किया जाएगा, साथ ही साथ भी शामिल है।

+0

का उपयोग कर रहे थे, तो मैंने इस सुझाव को लागू किया है (अधिक या कम)। यह वास्तव में एक बुरा हैक की तरह लगता है, लेकिन यह काम करता है। चीयर्स। –