2011-08-26 19 views
6

मुझे आवश्यकता है कि अंतिम उपयोगकर्ता स्थानीय संसाधनों को बदल सकता है और आवेदन को पुनरारंभ करने की आवश्यकता के बिना एप्लिकेशन में परिवर्तन दिखाई दे सकते हैं। परिदृश्य स्पष्ट करने के लिएएएसपी.नेट स्थानीयकरण: एप्लिकेशन को पुनरारंभ किए बिना संसाधनों को बदलना?

अद्यतन:
मैं कार्यावधि में स्थानीय संसाधनों बदलने के बारे में बात कर रहा हूँ। आइए कहें कि मेरे पास एक पृष्ठ के जर्मन अनुवाद में एक टाइपो है। फिर कुछ व्यवस्थापक-उपयोगकर्ता को उस टाइपो को रनटाइम में बदलने की संभावना होनी चाहिए। यूआई में इस बदलाव को प्रतिबिंबित करने के लिए पुनर्वितरण या पुनरारंभ करने की आवश्यकता नहीं होनी चाहिए।

मैं एएसपी.नेट एमवीसी 3 का उपयोग कर रहा हूं।

मेरे पास कौन से विकल्प हैं?

मैं custom ResourceProvider लिख रहा हूं जो डेटाबेस से संसाधन लोड करता है।
यह बहुत ज्यादा नहीं प्रयास लगता है, लेकिन अब तक मैं दो कमियां ने कहा:

  • यह DataAnnotations कि MVC3 में सुविधाजनक सत्यापन के लिए उपयोग किया जाता है के साथ काम नहीं कर रहा है (DataAnnotations एक ErrorMessageResourceType पैरामीटर, के साथ काम जो केवल संकलित संसाधनों के साथ काम करता है)
  • हमें मूल रूप से संसाधनों (जैसे अनुवाद आदि) के प्रबंधन के लिए अपना टूलिंग प्रदान करना होगा, जो दयालु है, क्योंकि इसके लिए बहुत सारे टूल हैं जो resx-files के साथ काम करते हैं।

अन्य विकल्प क्या हैं? रनटाइम पर तैनात रेक्स-फाइलों का हेरफेर एक विकल्प होगा?
लेकिन मुझे संदेह है कि जब एप्लिकेशन उन परिवर्तनों का पता लगाता है तो एप्लिकेशन स्वचालित रूप से "पुनरारंभ" होता है: मुझे संदेह है कि एएसपी.नेट को पता चलता है कि resx-files बदल गई है, फिर यह एप्लिकेशन-पूल को पुन: उपयोग करती है और नई resx-files को संकलित करती है उड़ना।
क्या यह सही है? क्या इसके आसपास कोई रास्ता है?

मैंने अभी तक तैनाती से पहले उपग्रह असेंबली में संसाधनों को संकलित करने में नहीं देखा है। क्या यह वेब अनुप्रयोगों के लिए भी एक अनुशंसित परिदृश्य है?
लेकिन संकलित उपग्रह असेंबली के साथ भी मुझे संदेह है कि एएसपी.नेट आवेदन को पुनरारंभ करता है, जब उन असेंबली फ्लाई पर बदल जाती हैं। क्या ये सही है?

मुझे किसी भी अनुभव में रुचि होगी कि मूल आवश्यकता को कैसे संतुष्ट किया जा सकता है? और मुझे ऊपर बताए गए विकल्पों के बारे में किसी भी टिप्पणी में दिलचस्पी होगी।

+1

क्या आपने [इस उत्तर] में प्रस्तावित UpdatableResXResourceProvider का प्रयास किया है (http://stackoverflow.com/questions/1535027/app-domain-restarts-when-resx-file-changes-any-way-to-avoid- यह/1853530 # 1853530)? –

+1

क्षमा करें मुझे रनटाइम पर मौजूदा संसाधनों को बदलने के लिए याद आती है, मुझे लगता है कि आपका एकमात्र विकल्प एक कस्टम संसाधन प्रदाता है, लेकिन मैंने कस्टम एनोटेशन का उपयोग किये बिना डेटा एन्नोटेशन मुद्दे को हल करने के लिए कोई साफ समाधान नहीं देखा है। – TheCodeKing

+0

मेरे पास ऐसा करने का एक तरीका है, लेकिन केवल तभी जब आपकी संसाधन कुंजी तय की जाती है? – TheCodeKing

उत्तर

1

डेटाअनोटेशन ErrorMessageResourceType स्वीकार करता है जो प्रमाणीकरण एट्रिब्यूट्स को संसाधनों तक पहुंचने के लिए कहता है। आप इस इस प्रकार पारित कर सकते हैं:

[Required(
    ErrorMessageResourceType = typeof(DynamicResources), 
    ErrorMessageResourceName = "ResourceKey")] 
public string Username { get; set; } 

प्रत्येक कुंजी के लिए स्थिर गुणों के साथ इस पैरामीटर के लिए एक प्रकार बना कर आप में एक कार्यान्वयन बना सकते हैं कि एक डेटाबेस या अन्य कार्यान्वयन से लोड संसाधनों। इसके बाद आप इसे DRY के लिए एक गतिशील वस्तु के साथ जोड़ सकते हैं और कार्यान्वयन को TryGetMember में ले जा सकते हैं।संभावित तो संकलन समय पर अपने डेटाबेस से स्टैटिक्स उत्पन्न करने के लिए, इस के साथ समाप्त टी -4 टेम्पलेट का उपयोग:

public class DynamicResources : DynamicObject 
{ 
    // move these into partial and generate using T4 
    public static string MyResource 
    { 
     get { return Singleton.MyResource; } 
    } 

    public static string MyOtherResource 
    { 
     get { return Singleton.MyOtherResource; } 
    } 

    // base implementation to retrieve resources 
    private static dynamic singleton; 

    private static dynamic Singleton 
    { 
     get { return singleton ?? (singleton = new DynamicResources()); } 
    } 

    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     // some logic here to look up resources 
     result = GetResourceKeyFromDatabase(binder.Name); 
     return true; 
    } 
} 

बेशक यह सही हो सकता है अगर संसाधनों स्थिर गुणों नहीं थे।

+0

यह समाधान प्रश्न में जुड़े एमएसडीएन से कस्टम संसाधन प्रदाता दृष्टिकोण के साथ काम नहीं करता है। एनोटेशन त्रुटि मैसेज रिसोर्सटाइप को ErrorMessageResourceName के साथ एक स्थैतिक संपत्ति रखने की अपेक्षा करता है। यह तब नहीं है जब आप गतिशील संसाधन लुकअप को लागू करते हैं। – jbandi

+0

ठीक है एक विकल्प है, निश्चित संसाधन कुंजी पर निर्भर करता है लेकिन फिर आपके ऐप में संसाधनों का उपयोग करने के लिए उन्हें वैसे भी पूर्वनिर्धारित करने की आवश्यकता है। – TheCodeKing

+0

धन्यवाद! शायद यह सबसे अच्छा है जो मैं प्राप्त कर सकता हूं। फिर भी, मैं उस समाधान के साथ जाने से पहले अन्य सत्यापन रणनीतियों को देखूंगा ... – jbandi

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

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