2011-08-22 16 views
7

मैं spring.net आईओसी निर्भरता इंजेक्शन का उपयोग कर अपने एएसपीनेट वेब एप्लिकेशन के लिए अपनी एक्सएमएल कॉन्फ़िगरेशन फ़ाइलों को स्थापित कर रहा हूं। मैंने web.config में मेरी प्रत्येक कॉन्फ़िगरेशन फ़ाइलों का संदर्भ दिया। Spring.net कॉन्फ़िगरेशन फ़ाइल (सेटिंग्स.एक्सएमएल) में सेटिंग का नमूना है:एकाधिक कॉन्फ़िगरेशन फ़ाइलों में spring.net ऑब्जेक्ट को फिर से परिभाषित करें

<object id="obj1" 
     type="NS.Common.Cache.Class, NS.Common" 
     singleton="true" 
     init-method="Initialize" 
     destroy-method="Dispose"> 
    <property name="Name" value="My Name" /> 
</object> 

यह सब ठीक काम करता है।

अब मैं अपने वेब एप्लिकेशन को कई वातावरण में स्थापित करता हूं इसलिए मैं पर्यावरण के लिए spring.net कॉन्फ़िगरेशन फ़ाइल बना रहा हूं। देव, क्यूए, प्रोड।

तो जब एप्लिकेशन इंस्टॉल करते हैं, तो लागू वातावरण वसंत फ़ाइल को web.config में संदर्भित किया जाता है। यह एक स्वचालित इंस्टॉलर का हिस्सा है।

क्यूए वातावरण फ़ाइल के भीतर, मैं करने के लिए "obj1" ऊपर वस्तु को फिर से परिभाषित करना चाहते हैं:

<object id="obj1" 
    type="NS.Common.Cache.Class2, NS.Common" 
    singleton="true" 
    init-method="Initialize" 
    destroy-method="Dispose"> 
    <property name="Name" value="My New Name" /> 
</object> 

हालांकि इस रूप में (पर्यावरण फाइल करने के लिए संदर्भ जोड़ने) स्वचालित है, settings.xml फ़ाइल है परिवर्तन नहीं हुआ है।

और अब एक ही आईडी के साथ परिभाषित ऑब्जेक्ट के साथ 2 फाइलों का संदर्भ - यह बड़ी समस्याएं उत्पन्न करता है क्योंकि रन टाइम त्रुटियां होती हैं।

क्या कोई तरीका है कि मैं qa.xml और ध्वज में शामिल कर सकता हूं या इस ऑब्जेक्ट परिभाषा को हाइलाइट करने के लिए किसी अन्य परिभाषित ऑब्जेक्ट को किसी अन्य एक्सएमएल फ़ाइल में उसी ऑब्जेक्ट आईडी के साथ ओवरराइड करता है?

+1

आप दो समान आईडी लोड कर सकते हैं और यह पहले सूचीबद्ध ऑब्जेक्ट को "ओवरराइड" करेगा (सृजन से पहले, AFAIK उन्हें <संसाधन ...> के माध्यम से संदर्भित करके विभिन्न फ़ाइलों में होना चाहिए। इसकी वजह से यह अच्छा है "वैश्विक अर्थ" से शुरू होने वाले क्रम में अपने संदर्भ संसाधनों को "स्थानीय अर्थ" से शुरू करने के लिए अभ्यास करें (अंतिम प्रविष्टि में app.config's होने पर) – Beachwalker

+2

@Stegi : इसे उत्तर के रूप में क्यों न दें? ऐसा लगता है कि यह ओपी की समस्या हल करता है। – Marijn

+1

* एकल * एक्सएमएल फ़ाइल में, एक आईडी आईडी केवल एक बार निर्दिष्ट की जा सकती है।'आईडी' विशेषता वास्तव में एक एक्सएमएल विशेषता है - इसलिए एक्सएमएल पार्सर आपको विजुअल स्टूडियो में और रनटाइम पर फ़ाइल लोड करते समय अतिरिक्त सत्यापन देता है। लेकिन जैसा कि स्टीगी का उल्लेख है, आप एक ही आईडी के साथ एक ही आईडी के साथ एक ही संदर्भ में लोड कर सकते हैं, जो एक ही संदर्भ से भरा हुआ है। आखिरी लोड की गई फ़ाइल से परिभाषा एक ही आईडी के साथ पिछली परिभाषाओं को ओवरराइड करता है। – Marijn

उत्तर

1

उसी आईडी के साथ निश्चित वस्तुओं (जो कि पहले से ही उल्लेख किया गया है, के रूप में संभव नहीं है) के बजाय आप एक कॉन्फ़िगरेशन फ़ाइल में एक उपनाम परिभाषित कर सकते हैं जिसे आप नियंत्रित करने में सक्षम हैं।

उदा। आप

<object name="ProdObj1" type="NS.Common.Cache.Class, NS.Common" singleton="true"> 
    <property name="Name" value="Prod" /> 
</object> 

और

<object name="TestObj1" type="NS.Common.Cache.Class, NS.Common" singleton="true"> 
    <property name="Name" value="Test" /> 
</object> 

हो सकता था और उसके बाद

<alias name="ProdObj1" alias="obj1"/> 
में

, उदाहरण के लिए, अपने web.config का उपयोग करें।

+0

यह केवल तभी काम करेगा जब आप 'settings.xml' को बदल सकते हैं, यानी 'obj1' को' ProdObj1' में बदल दें। सवाल से मैं समझता हूं कि ओपी बिल्कुल उस से बचना चाहता है। तो यह एक उपयोगी तकनीक हो सकती है - वास्तव में यह ओपी के परिदृश्य के लिए जाने का तरीका हो सकता है- लेकिन इसे 'settings.xml' को बदलने की आवश्यकता होगी। – Marijn

+0

सेटिंग्स.xml बदलने का आपका मतलब क्या है? – amateur

+0

आपका परिदृश्य जैसा कि मैंने इसे कम किया है: आपके पहले पैराग्राफ से मैंने पढ़ा है कि 'obj1' को "settings.xml" फ़ाइल में परिभाषित किया गया है? यह सेटिंग्स फ़ाइल आपके क्यूए और उत्पादन वातावरण पर तैनात है। क्यूए और उत्पादन दोनों पर आप सेटिंग्स.एक्सएमएल का संदर्भ देते हैं, जो (कुछ अनिर्दिष्ट कारणों के लिए) आप बदल नहीं सकते हैं। तो उत्पादन और क्यू दोनों पर, 'obj1' सेटिंग्स.xml में परिभाषित एक वस्तु है। – Marijn

6

आप दो समान आईडी लोड कर सकते हैं और अंतिम आईडी पहले सूचीबद्ध ऑब्जेक्ट को "ओवरराइड" कर देगी (सृजन से पहले, उन्हें संदर्भ परिभाषा के संदर्भ में अलग-अलग फाइलों में होना चाहिए)।

<context ...> 
    <resource ... /> <!-- put your 3rd-party (read-only config here) --> 
    <resource ... /> <!-- put your override ids here --> 
</context> 
इस डिफ़ॉल्ट व्यवहार की वजह से

यह एक अच्छा अभ्यास है "वैश्विक अर्थ" "स्थानीय अर्थ" करने के लिए नीचे (जैसे 3 पार्टी आप पुन: उपयोग करना चाहते हैं कॉन्फ़िगरेशन) के साथ शुरुआत क्रम में अपने संदर्भ ressources शामिल करने के लिए (होने एप्लिकेशन .config अंतिम प्रविष्टि के रूप में है)।

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