10

हमारे SharePoint/ASP.NET वातावरण में पुन: उपयोग के लिए हम डेटा रिट्रीवर वर्गों है कि सभी एक आम इंटरफ़ेस से निकाले जाते हैं की एक श्रृंखला है। मुझे डेटा रेट्रिवर बनाने का कार्य सौंपा गया था जो डब्ल्यूसीएफ का उपयोग करके अन्य शेयरपॉइंट खेतों के साथ दूरस्थ रूप से संवाद कर सकता था। जिस तरह से मैंने इसे फिलहाल कार्यान्वित किया है वह एक सिंगलटन ChannelFactory<T> एक स्थिर कन्स्ट्रक्टर में बनाया गया है और उसके बाद रिमोट डेटा रिट्रिवर के प्रत्येक इंस्टेंस द्वारा एक व्यक्तिगत प्रॉक्सी इंस्टेंस बनाने के लिए पुन: उपयोग किया जाता है। मुझे लगा कि यह अच्छी तरह से काम करेगा क्योंकि ChannelFactory केवल ऐप डोमेन में एक बार तत्काल हो जाता है और इसकी रचना guaranteed to be thread-safe है। मेरा कोड ऐसा कुछ दिखता है:ChannelFactory <T> एक सिंगलटन बनाना और ग्राहक कनेक्शन

public class RemoteDataRetriever : IDataRetriever 
{ 
    protected static readonly ChannelFactory<IRemoteDataProvider> 
     RequestChannelFactory; 

    protected IRemoteDataProvider _channel; 

    static RemoteDataRetriever() 
    { 
     WSHttpBinding binding = new WSHttpBinding(
      SecurityMode.TransportWithMessageCredential, true); 

     binding.Security.Transport.ClientCredentialType = 
      HttpClientCredentialType.None; 

     binding.Security.Message.ClientCredentialType = 
      MessageCredentialType.Windows; 

     RequestChannelFactory = 
      new ChannelFactory<IRemoteDataProvider>(binding); 
    } 

    public RemoteDataRetriever(string endpointAddress) 
    { 
     _channel = RemoteDataRetriever.RequestChannelFactory. 
      CreateChannel(new EndpointAddress(endpointAddress)); 
    } 
} 

मेरा सवाल है, क्या यह एक अच्छा डिज़ाइन है? मुझे लगा कि एक बार ChannelFactory बनाया गया है, मुझे थ्रेड-सुरक्षा के बारे में चिंता करने की आवश्यकता नहीं है क्योंकि मैं केवल CreateChannel() पर कॉल करने के लिए इसका उपयोग कर रहा हूं लेकिन क्या मुझे गलती है? क्या यह राज्य बदल रहा है या अन्यथा दृश्यों के पीछे कुछ फंकी कर रहा है जो थ्रेडिंग मुद्दों का कारण बन सकता है? साथ ही, मुझे लगता है कि मैन्युअल ChannelFactory के disposes या मैं मान सकते हैं कि जब भी आईआईएस रिबूट हो जाता है यह मेरे लिए सब सफाई काम करूँगा कहीं में कुछ कोड डाल करने के लिए (स्थिर finalizer?) की जरूरत है?

संबंधित: ChannelFactory Reuse Strategies

उत्तर

3

"यह सिंगलटन डिज़ाइन अच्छा है" से, आपके कार्यान्वयन सिंगलटन ठीक है। यह थ्रेड-सुरक्षित है, और ChannelFactory<T> थ्रेड-सुरक्षित भी है।

आप संसाधन के सफाई के बारे में चिंता करने की जरूरत नहीं है। यह मानते हुए कि ChannelFactory<T>Microsoft's guidelines for implementing IDisposable का पालन करता है, तो आपको किसी प्रकार की रिसाव के साथ कोई समस्या नहीं होगी। जब एक आवेदन डोमेन गिराया गया है, एक कचरा संग्रहण बनाया जाएगा, और सब कुछ उस बिंदु पर साफ हो जाएगा। ChannelFactory<T> पर फाइनलर क्लीनअप करेगा जो आम तौर पर निपटाने के लिए कॉल में करेगा।

हालांकि, "मुझे ChannelFactory<T> कैशिंग करना चाहिए" बिंदु से, यह कहना मुश्किल है, क्योंकि आप यह इंगित नहीं करते हैं कि आप .NET का कौन सा संस्करण चालू हैं। हालांकि, अगर आप को इंगित लेख बताती है कि आप .NET 3.0 SP1 या इसके बाद के संस्करण का उपयोग कर रहे हैं, तो आप वास्तव में यह करने के लिए आप अपने प्रॉक्सी (यह मानते हुए वे ClientBase<T> से निकाले जाते हैं) जहां आप इसे ग्राहक कोड में की जरूरत है बना सकते हैं की जरूरत नहीं है, , और इस तरह एक कारखाने पैटर्न के माध्यम से नहीं।

+0

मुझे एक दास गोरा आलेख मिला जो एक ही चीज़ को इंगित करता है - http://www.dasblonde.net/PermaLink.aspx?guid=c7922cb4-26d4-408b-b029-cfadd75ff954। हालांकि, "आपके लिए जेनरेट किए गए शब्द" ने मुझे पूरे क्लाइंटबेस पर थोड़ा सा दृष्टिकोण दिया है। फिर भी, मुझे लगता है कि आप इसके साथ निशान पर हैं। –

+0

एक और डब्ल्यूसीएफ समस्या के लिए शोध करते समय मैंने क्लाइंटबेस पर क्लाइंटबेस पर चैनलफैक्टरी का समर्थन करने का एक अच्छा कारण खोजा - http://stackoverflow.com/questions/2252747/what-is-system-servicemodel-diagnostics-callbackexception-and-why-cant -आई-हैंडल –

+0

@ रेपो मैन: यदि आप पसंद करते हैं, लेकिन अपवादों को फिर से लपेटना सबसे अच्छा अभ्यास नहीं है जब तक आपके पास ऐसा करने का अच्छा कारण न हो। डब्ल्यूसीएफ में इस प्रकृति की त्रुटियों के लिए, मुझे विश्वास नहीं है कि यह अपवादों को फिर से लपेटने के लिए अर्हता प्राप्त करता है। – casperOne

0

जब तक आपके "सिंगलटन" बस नवनिर्मित चैनलों लौटा रहा है, तो आप धागा सुरक्षा के बारे में चिंता करने की जरूरत नहीं है। यदि आप किसी भी संकलक अनुकूलन को कमजोर कर सकते हैं जो आपको कमजोर कर सकते हैं, तो आप हमेशा स्थिर घोषणा पर अस्थिर कीवर्ड को फेंक सकते हैं, लेकिन मुझे नहीं लगता कि यह इस मामले में आवश्यक है।

बस अपने आप को लंबी अवधि के लचीलेपन के बारे में सवाल पूछने के लिए प्रयास करें। उदाहरण के लिए, यदि आपने बाद में इस CreateChannel विधि में कुछ राज्य जोड़ने का निर्णय लिया है तो क्या होगा? शायद यह 10 चैनल बनाने की तरह कुछ करेगा, उसके बाद फिर से उनका उपयोग शुरू करें। क्या आप इसे करने के लिए अपने सिंगलटन को आसानी से संशोधित कर सकते हैं?

आपका जवाब शायद हाँ, लेकिन क्या अगर आप तब खड़ी कई सर्वरों के लिए पैमाने पर है? एक सिंगलटन पर्याप्त नहीं हो सकता है। आपको उदाहरण/सर्वर (उदा। डेटाबेस, वितरित कैश) के बीच राज्य साझा करने के लिए कुछ तरीका चाहिए; राज्य को साझा करने का निर्णय लेने के आधार पर, एक स्थिर संदर्भ में करना मुश्किल हो सकता है।

0

I this article, डैनियल वॉन सिंगलटन मैनेजर ऑब्जेक्ट में चैनलों को कैश करने की वकालत करते हैं लेकिन चैनलफैक्टरी को कैशिंग नहीं करते हैं। हम कोई समस्या नहीं सफलता अब तक के साथ इस दृष्टिकोण का उपयोग किया गया है ...

ऐसा करने के लाभों

हैं:

"जब चैनल एक गलती राज्य में प्रवेश करती यह कैश से निकाल और जब यह अगले अनुरोध किया जाता है निर्मित है ..."

  • सुरक्षा बातचीत ही है एक बार प्रदर्शन किया।
  • प्रत्येक उपयोग पर एक चैनल को स्पष्ट रूप से बंद करने से बचें।
  • हम अतिरिक्त प्रारंभिक कार्यक्षमता जोड़ सकते हैं।
  • प्रॉक्सी सर्वर के साथ संवाद करने में असमर्थ होने पर हम जल्दी विफल हो सकते हैं।
+1

मुझे पता है कि यह पुराना है .. लेकिन क्या यह प्रभावी ढंग से चैनलफैक्टरी को कैश नहीं करेगा? कारखाने को छोड़ने के बाद से इसके चैनल बंद हो जाते हैं। – Tracker1