2009-04-09 19 views
5

सबसे पहले, मैं चाहता हूं कि संदर्भ आधारित संग्रहण ढांचे में सुसंगत रहे!एक-आकार-फिट-सभी संदर्भ आधारित संग्रहण की मांग

इसके साथ, मैं इन गुणों को एएसपी.नेट, डब्ल्यूसीएफ और किसी भी अन्य बहुप्रचारित .NET कोड में सुरक्षित बनाने के लिए एक सुरुचिपूर्ण समाधान की तलाश में हूं। गुण कुछ निम्न-स्तरीय ट्रेसिंग हेल्पर्स में स्थित हैं (यदि आप सोच रहे हैं कि वे आंतरिक क्यों हैं तो ये विधियों के माध्यम से सामने आए हैं)।

मैं अनियंत्रित असेंबली (जैसे System.Web, आदि) पर निर्भरता नहीं रखूंगा। मैं कुछ भी कॉन्फ़िगर करने के लिए इस कोड का उपयोग कर किसी को भी आवश्यकता नहीं चाहता हूं। मैं बस इसे काम करना चाहता हूं;) यह ऑर्डर का बहुत लंबा हो सकता है ...

किसी के पास अपनी आस्तीन की कोई चाल है? (मैं वसंत के कार्यान्वयन देखा है)

internal static string CurrentInstance 
    { 
     get 
     { 
      return CallContext.LogicalGetData(currentInstanceSlotName) as string; 
     } 
     set 
     { 
      CallContext.LogicalSetData(currentInstanceSlotName, value); 
     } 
    } 

    internal static Stack<ActivityState> AmbientActivityId 
    { 
     get 
     { 
      Stack<ActivityState> stack = CallContext.LogicalGetData(ambientActivityStateSlotName) as Stack<ActivityState>; 
      if (stack == null) 
      { 
       stack = new Stack<ActivityState>(); 
       CallContext.LogicalSetData(ambientActivityStateSlotName, stack); 
      } 

      return stack; 
     } 
    } 

अद्यतन

तक सुरक्षित मैं सिंक्रनाइज़ मतलब नहीं है। इस मुद्दे पर पृष्ठभूमि here

+0

मेरे पास प्रस्ताव देने के लिए बहुत कुछ नहीं है, लेकिन मुझे इस मुद्दे में भी रूचि है। एफडब्लूआईडब्लूडब्ल्यू मुझे कुछ स्रोत भंडार (शायद कैसल, एन इंजेक्ट, या एनएचबीरनेट) में देखकर याद है, आईसीएन्टेक्स्ट जैसे कुछ के कई कार्यान्वयन जो मुझे लगता है कि एक ऐप में DI'd किया गया है। प्रत्येक आईसीएन्टेक्स्ट कार्यान्वयन ने एक अलग तकनीक का उपयोग किया (कॉलकॉन्टेक्स्ट, एचटीपी कोंटेक्स्ट, थ्रेड.SetData, आदि)। मैं बिल्कुल नहीं जानता कि उनका उपयोग कैसे किया जाना था, लेकिन मेरा पहला विचार यह था कि यह "संदर्भ" सार था। वैसे भी, मैं देख सकता हूं कि मुझे क्या मिल सकता है जो मैंने पहले पाया और एक लिंक पोस्ट किया। यह उपयोगी हो सकता है। – wageoghe

उत्तर

0

मुझे नहीं पता कि कॉलकॉन्टेक्स्ट का उपयोग करना सही जगह है यदि इच्छा केवल आपकी संपत्तियों के लिए थ्रेड-सुरक्षित पहुंच प्रदान करने के लिए है। यदि ऐसा है, तो लॉक स्टेटमेंट आपको चाहिए।

हालांकि, आपको यह सुनिश्चित करना होगा कि आप इसे सही ढंग से लागू कर रहे हैं।

कॉलकॉन्टेक्स्ट के साथ, आपको थ्रेड-सुरक्षित एक्सेस प्राप्त करने जा रहे हैं क्योंकि कॉल के अलग-अलग उदाहरण होने पर आपको अलग-अलग धागे (या विभिन्न स्टोर,) पर कॉल आने पर कॉल करने के लिए अलग-अलग उदाहरण होंगे। हालांकि, संसाधन संसाधन थ्रेड-सुरक्षित तक पहुंच बनाने से यह बहुत अलग है।

यदि आप एक ही मान को एकाधिक थ्रेड में साझा करना चाहते हैं, तो लॉक स्टेटमेंट जाने का तरीका है। अन्यथा, यदि आप प्रति-थ्रेड/कॉल आधार पर विशिष्ट मान चाहते हैं, तो कॉलकॉन्टेक्स्ट का उपयोग करें, या थ्रेड क्लास, या थ्रेडस्टैटिक विशेषता (या थ्रेड-आधारित स्टोरेज तंत्र की किसी भी संख्या) पर स्थिर गेटडाटा/सेटडाटा विधियों का उपयोग करें।

+0

मैं सिंक्रनाइज़ेशन से चिंतित नहीं हूं। जैसा कि आपने कहा था, वे संदर्भ आधारित भंडारण के लिए कई तंत्र हैं और कुछ कुछ स्थितियों में काम नहीं करते हैं (यानी कॉलकॉन्टेक्स्ट और एएसपी.नेट में थ्रेडस्टैटिक) इसलिए मेरा प्रश्न है। – jsw

2

यहाँ (कम से कम का हिस्सा) NHibernate के "संदर्भ" कार्यान्वयन के लिए एक लिंक है:

https://nhibernate.svn.sourceforge.net/svnroot/nhibernate/trunk/nhibernate/src/NHibernate/Context/

यह बिल्कुल जहां या कैसे इस NHibernate के संदर्भ में खेलने में आता है मेरे लिए स्पष्ट नहीं है। यही है, अगर मैं "संदर्भ" में कुछ मूल्यों को स्टोर करना चाहता हूं तो क्या मुझे एनएचबेर्नेट से "संदर्भ" मिलेगा और मेरे मूल्य जोड़ देंगे? मैं NHibernate का उपयोग नहीं करता, इसलिए मुझे वास्तव में पता नहीं है।

मुझे लगता है कि यदि आप इस प्रकार के कार्यान्वयन के लिए उपयोगी होंगे तो आप खुद को देख और निर्धारित कर सकते हैं। स्पष्ट रूप से विचार आवेदन के प्रकार (एएसपी.नेट, डब्ल्यूसीएफ, आदि) के आधार पर इच्छित कार्यान्वयन को इंजेक्ट करना होगा। यह शायद कुछ विन्यास का तात्पर्य है (शायद आईसीएफ का उपयोग करने के लिए एमईएफ का उपयोग करने के लिए न्यूनतम "आईसीआरेंटेंट सत्र कॉन्टेक्स्ट इंटरफेस)।

किसी भी दर पर, मैं इस विचार दिलचस्प है जब मैं यह कुछ समय पहले मिला जबकि, CallContext.SetData/GetData/LogicalSetData/LogicalGetData के बारे में जानकारी के लिए खोज Thread.SetData/GetData, [ThreadStatic], पाया आदि

इसके अलावा, बजाय CallContext.SetDataCallContext.LogicalSetData के आपके उपयोग के आधार पर, मैं मान लीजिए कि आप इस तथ्य का लाभ उठाना चाहते हैं कि लॉजिकल थ्रेड से जुड़ी जानकारी को जानकारी के स्टोर के लिए "थ्रेड सुरक्षित" स्थान चाहते हैं, इसके विपरीत बाल धागे को प्रचारित किया जाएगा।इसलिए, यदि आप अपने ऐप के स्टार्टअप में परिवेश सक्रियता सेट करना चाहते हैं और फिर किसी और गतिविधि को धक्का नहीं देते हैं, तो बाद के थ्रेड भी उसी गतिविधि का हिस्सा होंगे क्योंकि लॉजिकलसेटडेटा के माध्यम से संग्रहीत डेटा को बाल धागे द्वारा विरासत में मिलाया जाता है।

अगर आपने इस सवाल से पहले कुछ भी सीखा है, तो आपने इसके बारे में सुनने में बहुत दिलचस्पी होगी। यहां तक ​​कि यदि आपने नहीं किया है, तो भी मुझे इस संदर्भ में रुचि होगी कि आप संदर्भ के साथ क्या कर रहे हैं।

फिलहाल, मैं लॉगिंग/ट्रेसिंग के लिए कुछ संदर्भ जानकारी बनाए रखने पर काम कर रहा हूं (Trace.CorrelationManager.ActivityId और Trace.CorrelationManager.LogicalOpertionStack और log4net/NLog संदर्भ समर्थन के समान)। मैं किसी ऐप या डब्ल्यूसीएफ सेवा में उपयोग के लिए कुछ संदर्भ (वर्तमान ऐप, वर्तमान ऐप इंस्टेंस, वर्तमान गतिविधि (शायद नेस्टेड)) को सहेजना चाहता हूं और मैं इसे डब्ल्यूसीएफ सेवा सीमाओं में "स्वचालित रूप से" प्रचारित करना चाहता हूं। यह क्लाइंट/गतिविधि/आदि द्वारा सहसंबंधित करने के लिए केंद्रीय भंडार में लॉगिंग कथन लॉग इन करने की अनुमति है। हम एक विशिष्ट अनुप्रयोग के एक विशिष्ट उदाहरण द्वारा सभी लॉगिंग बयानों के लिए पूछताछ और सहसंबंध करने में सक्षम होंगे। लॉगिंग स्टेटमेंट क्लाइंट या एक या अधिक डब्ल्यूसीएफ सेवाओं में उत्पन्न हो सकता था।

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

वर्तमान में मैं IClientMessageInspector और IDispatchMessageInspector का उपयोग करके हमारी "संदर्भ" जानकारी के प्रसार को प्रोटोटाइप कर रहा हूं। ऐसा लगता है कि यह शायद हमारे लिए ठीक काम करेगा।

System.Web पर निर्भरता के संबंध में, एनएचबीर्नेट कार्यान्वयन में "प्रतिबिंबित एचटीपी कॉन्टेक्स्ट" होता है जो एचटीपीकॉन्टेक्स्ट तक पहुंचने के लिए प्रतिबिंब का उपयोग करता है, इसलिए System.Web पर कोई प्रोजेक्ट निर्भरता नहीं होगी। जाहिर है, सिस्टम.Web को उपलब्ध होना होगा जहां ऐप को तैनात किया गया है यदि HttpContext को उपयोग करने के लिए कॉन्फ़िगर किया गया है।