उपयोग फैक्ट्री का एक उदाहरण बनाने के लिए चैनलफैक्टरी, फिर उस उदाहरण को कैश करें। फिर आप कैश किए गए आचरण से आवश्यक/वांछित के रूप में communicatino चैनल बना सकते हैं।
क्या आपको कई चैनल कारखानों की आवश्यकता है (यानी, क्या कई सेवाएं हैं)? मेरे अनुभव में, वह जगह है जहां आप प्रदर्शन में सबसे बड़ा लाभ देखेंगे। एक चैनल बनाना एक काफी सस्ता काम है; यह शुरुआत में सबकुछ स्थापित कर रहा है जिसमें समय लगता है।
मैं व्यक्तिगत चैनलों को कैश नहीं करता - मैं उन्हें बनाउंगा, उन्हें एक ऑपरेशन के लिए उपयोग करें, और फिर उन्हें बंद करें। यदि आप उन्हें कैश करते हैं, तो वे समय निकाल सकते हैं और चैनल गलती करेगा, फिर आपको इसे निरस्त करना होगा और वैसे भी एक नया बनाना होगा।
यह सुनिश्चित नहीं है कि आप चैनलफैक्टरी को लागू करने के लिए सिंगलटन का उपयोग क्यों करना चाहते हैं, खासकर यदि आप इसे बनाने और इसे कैश करने जा रहे हैं, और केवल एक एंडपॉइंट है।
जब मैं थोड़ा और समय लेता हूं तो मैं बाद में कुछ उदाहरण कोड पोस्ट करूंगा।
अद्यतन: कोड उदाहरण
यहाँ मैं कैसे काम पर एक परियोजना के लिए इस कार्यान्वित का एक उदाहरण है। मैंने ChannelFactory<T>
का उपयोग किया, क्योंकि जिस एप्लिकेशन को मैं विकसित कर रहा था वह कई सेवाओं के साथ एक एन-स्तरीय ऐप है, और अधिक जोड़ा जाएगा। लक्ष्य प्रति दिन एक बार ग्राहक बनाने के लिए एक आसान तरीका था, और फिर आवश्यकतानुसार संचार चैनल बनाएं। विचार की मूल बातें मेरी नहीं हैं (मुझे इसे वेब पर एक लेख से मिला है), हालांकि मैंने अपनी आवश्यकताओं के लिए कार्यान्वयन में संशोधन किया।
मेरे पास मेरे आवेदन में एक स्थिर सहायक वर्ग है, और उस कक्षा के भीतर मेरे पास एक शब्दकोश और चैनफेल फैक्ट्री से संचार चैनल बनाने का एक तरीका है।
शब्दकोश निम्नानुसार है (वस्तु मूल्य है क्योंकि इसमें विभिन्न चैनल कारखानियां होंगी, प्रत्येक सेवा के लिए एक)। मैंने उदाहरण में "कैश" को प्लेसहोल्डर के प्रकार के रूप में रखा है - जो भी कैशिंग तंत्र आप उपयोग कर रहे हैं उसके साथ सिंटैक्स को प्रतिस्थापित करें।
public static Dictionary<string, object> OpenChannels
{
get
{
if (Cache["OpenChannels"] == null)
{
Cache["OpenChannels"] = new Dictionary<string, object>();
}
return (Dictionary<string, object>)Cache["OpenChannels"];
}
set
{
Cache["OpenChannels"] = value;
}
}
अगला कारखाना उदाहरण से संचार चैनल बनाने का एक तरीका है। विधि यह देखने के लिए जांचती है कि कारखाना पहले मौजूद है या नहीं - अगर ऐसा नहीं होता है, तो यह इसे बनाता है, इसे शब्दकोश में डालता है और फिर चैनल उत्पन्न करता है। अन्यथा यह कारखाने के कैश किए गए उदाहरण से बस एक चैनल उत्पन्न करता है।
public static T GetFactoryChannel<T>(string address)
{
string key = typeof(T.Name);
if (!OpenChannels.ContainsKey(key))
{
ChannelFactory<T> factory = new ChannelFactory<T>();
factory.Endpoint.Address = new EndpointAddress(new System.Uri(address));
factory.Endpoint.Binding = new BasicHttpBinding();
OpenChannels.Add(key, factory);
}
T channel = ((ChannelFactory<T>)OpenChannels[key]).CreateChannel();
((IClientChannel)channel).Open();
return channel;
}
मैंने इस उदाहरण को कुछ कामों से अलग कर दिया है जो मैं काम पर उपयोग करता हूं। इस विधि में आप बहुत कुछ कर सकते हैं - आप एकाधिक बाइंडिंग को संभाल सकते हैं, प्रमाणीकरण के लिए प्रमाण पत्र असाइन कर सकते हैं। यह क्लाइंट उत्पन्न करने के लिए आपका एक बहुत ही शॉपिंग सेंटर है।
अंत में, जब मैं इसे एप्लिकेशन में उपयोग करता हूं, तो मैं आम तौर पर एक चैनल बनाता हूं, अपना व्यवसाय करता हूं, और इसे बंद करता हूं (या आवश्यकता होने पर इसे रोक दें)। उदाहरण के लिए:
IMyServiceContract client;
try
{
client = Helper.GetFactoryChannel<IMyServiceContract>("http://myserviceaddress");
client.DoSomething();
// This is another helper method that will safely close the channel,
// handling any exceptions that may occurr trying to close.
// Shouldn't be any, but it doesn't hurt.
Helper.CloseChannel(client);
}
catch (Exception ex)
{
// Something went wrong; need to abort the channel
// I also do logging of some sort here
Helper.AbortChannel(client);
}
उम्मीद है कि उपर्युक्त उदाहरण आपको आगे बढ़ने के लिए कुछ देंगे। मैं उत्पादन के माहौल में लगभग एक साल के लिए इस तरह का कुछ उपयोग कर रहा हूं और यह बहुत अच्छा काम करता है। 99% किसी भी समस्या का सामना करना पड़ता है आमतौर पर आवेदन के बाहर कुछ (या तो बाहरी क्लाइंट या डेटा स्रोत हमारे प्रत्यक्ष नियंत्रण में नहीं) से संबंधित होते हैं।
अगर मुझे कुछ स्पष्ट नहीं है या आपके पास और प्रश्न हैं तो मुझे बताएं।
# 3 के लिए, हाँ, केवल एक चैनल फैक्ट्री बनाई जानी चाहिए। असल में, आपके पास प्रत्येक सेवा समाप्ति के लिए एक चैनल फैक्ट्री होगी। मेरे मामले में, हमारे पास लगभग 6 स्तर हैं, मुख्य रूप से 2 स्तरों में फैले हुए हैं। आपके मामले में, यदि आपके पास केवल एक ही सेवा है, तो एक ऐप द्वारा उपयोग करें, आप बस जो कर रहे हैं वह कर सकते हैं। आप उपरोक्त कोड सही रास्ते पर हैं। कैशिंग ऐप की जरूरतों पर आधारित होगी। – Tim
@Tim- आपकी सभी मदद के लिए धन्यवाद। मेरे द्वारा सच में इसकी प्रशंसा की जाती है! मुझे लगता है कि मेरे मामले में, तथ्य यह है कि मेरी सेवा इतनी "सरल" थी जिससे मुझे इन अन्य उदाहरणों पर भ्रम पैदा हो रहा था जहां कई अंतराल थे। मुझे = कम उलझन में = टिम ने एक महान काम समझाया! धन्यवाद दोस्त! – Didaxis
आपका स्वागत है। खुशी है कि मैं मदद कर सकता हूँ - खुश कोडिंग! – Tim