2008-11-24 5 views
35

मेरे पास एक ऐसा एप्लिकेशन है जिसे कई ऐपडोमेन के बीच संदेशों की एक मामूली उच्च मात्रा भेजने की आवश्यकता है। मुझे पता है कि मैं इसे रिमोटिंग का उपयोग करके कार्यान्वित कर सकता हूं, लेकिन मैंने यह भी देखा है कि क्रॉस-डोमेन प्रतिनिधि हैं। क्या किसी ने इस तरह की समस्या देखी है?AppDomains के बीच संवाद करने के लिए सबसे अच्छा कैसे है?

+0

नामित पाइप का उपयोग कर डब्ल्यूसीएफ मेरे लिए पसंदीदा जैसा दिखता है - मैं कम से कम नेटवर्क पर जाने की आवश्यकता से बच सकता हूं। सबको धन्यवाद! –

+0

इस तकनीक के बारे में विस्तार करने के लिए देखभाल? उदाहरण के लिए, नामित पाइप का उपयोग करने की कार्यक्षमता लागत और ऐपडोमेन्स और एमबीआरओ (मार्शलबीरफोब ऑब्जेक्ट) की तुलना में उपयोग की आसानी क्या है। –

+0

मेरे पास हाथ रखने के लिए कोई आंकड़ा नहीं है, लेकिन बाइनरी सीरियलाइज़र और नामित पाइप का उपयोग करने से मुझे डोमेन के बीच काफी सहजता से संवाद करने की अनुमति मिली है। मैं एक साधारण संदेश बस के साथ आया था और तब से ही समस्या को अनदेखा कर सकता हूं। –

उत्तर

25

मुझे नामित पाइप बाध्यकारी के साथ डब्ल्यूसीएफ का उपयोग करके अच्छी सफलता मिली है। नामित पाइप का उपयोग करने से कोई नेटवर्क ट्रैफिक नहीं होता है और बाइनरी एन्कोडिंग का उपयोग होता है, इसलिए भविष्य में स्केलिंग परिदृश्यों में वितरित करने की क्षमता को बलि किए बिना यह बहुत तेज़ होना चाहिए।

संपादित करें: कार्यान्वयन उदाहरण के लिंक सहित अधिक विस्तृत जानकारी के लिए here देखें।

3

यह सिर्फ एक त्वरित विचार है, लेकिन मैंने सुना है कि क्रॉस-डोमेन संचार डब्ल्यूसीएफ पाठ्यक्रम के .NET 3.0 से शुरू होने वाली अनुशंसित दृष्टिकोण होगी। असल में यह समझ में आता है, क्योंकि रिमोटिंग डब्ल्यूसीएफ द्वारा लिपटे एक और तकनीक है।

12

एक क्रॉस-डोमेन प्रतिनिधि केवल शून्य पैरामीटर के साथ एक शून्य विधि की अनुमति देता है, और शायद यह नहीं है कि आप क्या सोचते हैं। यह केवल एक ऐपडोमेन से अधिसूचना उद्देश्यों के लिए एक सरल कॉलबैक के रूप में केवल मुश्किल है, उदाहरण के लिए InitComplete() या कुछ जैसी विधि।

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

+0

मुझे रिमोटिंग ध्वनि .NET 1.1 मुझे।क्या क्रॉस-एपडोमेन संचार करने के लिए कोई नया विकल्प है? –

+0

रिमोटिंग कभी नहीं चली गई। यह अभी भी हर जगह इस्तेमाल किया जाता है। डब्ल्यूसीएफ का आधुनिकीकरण क्रॉस प्रोसेस (आईपीसी) कॉल के लिए आया था। लेकिन एपडोमेन के लिए, यह हमेशा remoting रहा है। आप नामित पाइप के साथ डब्ल्यूसीएफ का उपयोग कर सकते हैं, लेकिन मेह। रिमोटिंग कम परेशानी आईएमओ है। – x0n

+1

@ x0n, [Remoting] एक विरासत तकनीक है जो मौजूदा अनुप्रयोगों के साथ पिछड़े संगतता के लिए बनाए रखा गया है और नए विकास के लिए अनुशंसित नहीं है। वितरित अनुप्रयोगों को अब विंडोज संचार फाउंडेशन (डब्ल्यूसीएफ) का उपयोग करके विकसित किया जाना चाहिए। http://msdn.microsoft.com/library/72x4h507.aspx – Guillaume

9

-Oisin मैं सिर्फ पता चला कि आप भी AppDomain.SetData उपयोग कर सकते हैं, लेकिन यह सिर्फ एक ही रास्ता होस्ट डोमेन बाल डोमेन के लिए से है।

static void RunInChildDomain() 
{ 
    AppDomain childDomain = AppDomain.CreateDomain("friendlyName"); 
    string parameterValue = "notmii"; 
    childDomain.SetData("parameter", parameterValue); 
    childDomain.DoCallBack(PrintName); 
} 

static void PrintName() 
{ 
    string Name = Convert.ToString(AppDomain.CurrentDomain.GetData("parameter")); 
    Console.WriteLine(Name); 
} 

तुम भी AppDomain.FirstChanceException घटना का उपयोग करके बच्चे और मेजबान appdomain के बीच अपवाद संचालित संचार बना सकते हैं :)

1

मैं Xon के जवाब पर विस्तार करना चाहते हैं। वह या तो डब्ल्यूसीएफ या मार्शलबीरफॉब्जेक्ट का उपयोग करने की सिफारिश करता है, लेकिन यह देखते हुए कि सवाल ऐपडोमेन्स के बीच संचार के बारे में पूछता है, और प्रक्रियाओं के बीच संचार के बारे में नहीं, मुझे लगता है कि एमबीआरओ दृष्टिकोण लागू करने के लिए काफी आसान है, और इसलिए सही जवाब है।

जब मैं स्वयं इस मुद्दे पर शोध कर रहा था, तो मैंने पहली बार यह समझने के लिए संघर्ष किया कि बच्चे एपडोमेन माता-पिता के साथ संवाद कैसे कर सकता है, जब तक मुझे एहसास नहीं हुआ कि आप बच्चे में एमबीआरओ ऑब्जेक्ट को हैंडल पास कर सकते हैं, और बच्चा तब कर सकता था अनचाहे है कि माता-पिता (या किसी अन्य ऐपडोमेन) को संवाद करने के लिए संभाल लें। मैंने अपने प्रश्न here पर एक समाधान पोस्ट किया।

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

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

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