मेरे पास एक मुख्य एप्लीकेशन है जो कुछ प्लगइन्स लोड करता है। इन प्लगइन्स को "मार्शलबीरफॉबजेक्ट" से प्राप्त होने वाली कक्षा का उपयोग करके अलग-अलग ऐप डोमेन में लोड और चलाया जाता है; यह सब ठीक काम करता है।मैं एक ऐप डोमेन में प्लगइन से डेटा कैसे भेज सकता हूं जो सी # में मुख्य एप्लिकेशन में किसी ईवेंट को ट्रिगर करता है?
अब मुझे जो चाहिए वह संभालने का एक तरीका है जब प्लगइन मुख्य ऐप को कुछ करने के लिए और मुख्य अनुप्रयोग में गतिशील रूप से इसे संभालने का तरीका चाहता है। यदि आदेशों की सूची के लिए प्लगइन को पोल करना सबसे अच्छा तरीका है, तो मैं ऐसा कर सकता हूं, हालांकि यह थोड़ा सा लगता है।
ऐप डोमेन में मुख्य ऐप में प्लगइन से अनुरोध भेजने का सबसे अच्छा तरीका क्या है?
अद्यतन
प्रश्न के लिए एक अद्यतन के रूप में, मैं (एक "फ़ाइल> नया" ऑपरेशन या "GetSomeData की तरह, अनुप्रयोग डोमेन मुख्य अनुप्रयोग कुछ करना है कि भर में डेटा भेजा करने के लिए देख रहा हूँ) "कॉल करें। ऐसा करने में मुझे मुख्य ऐप के लिए प्लगइन को जो कुछ भी कर रहा है उसे पूरा करने की आवश्यकता है, लेकिन यह भी अनुरोध किया जा सकता है कि मुख्य ऐप पक्ष, अनुरोधित फ़ंक्शन/ईवेंट निष्पादित करना है या नहीं।
मैं प्लगइन को एक इंटरफ़ेस पास करके ऐसा कर रहा था। यह इंटरफेस मुख्य ऐप में एक वर्ग द्वारा कार्यान्वित किया गया था जिसने कुछ घटनाओं को परिभाषित किया था। मुख्य ऐप तब इन घटनाओं की सदस्यता ले सकता है और प्लगइन मुख्य ऐप को आग लग सकता है। समस्या यह है कि इंटरफ़ेस ने केवल क्लास का संदर्भ दिया क्योंकि जब मैं इंटरफ़ेस पास करता था। यानी अगर मैं सदस्यता ली बिना ईवेंट वाली श्रेणी का निर्माण, तो इस तरह इंटरफ़ेस से पारित कर दिया:
CallbackClass myCallbackClass = new CallbackClass();
pluginInterface.HeresMyCallbackClass((ICallbackClass)myCallbackClass);
प्लगइन इंटरफ़ेस प्राप्त होगा, लेकिन मूल वर्ग में कोई भी परिवर्तन का प्रचार नहीं किया। तो जोड़ना:
myCallbackClass.MyMainAppEvent += new MainEventHandler(MyMainAppFunction);
ईवेंट के प्लगइन के संस्करण को नहीं बदलेगा। प्लगइन ऐसा कर सकता है:
//code within plugin
ICallbackClass callToMainApp;
public HeresMyCallbackClass(ICallbackClass cbClass)
{
callToMainApp = cbClass;
}
public CallAMainAppFunction()
{
callToMainApp.CallTheSubscribedFunction(); //This is where it all goes wrong
}
... लेकिन घटना में है कि इसे कहते हैं की कोशिश करता है रिक्त है।
CallbackClass myCallbackClass = new CallbackClass();
myCallbackClass.MyMainAppEvent += new MainEventHandler(MyMainAppFunction); //Subscribe first
pluginInterface.HeresMyCallbackClass((ICallbackClass)myCallbackClass);
प्लगइन तो CallTheSubscribedFunction()
कह सकते हैं और घटना मुख्य अनुप्रयोग में से निकाल देते थे: अब, यह एक समस्या अगर मैं मुख्य एप्लिकेशन पहली घटना की सदस्यता है, तो इंटरफ़ेस से पारित नहीं है। मुझे मांग पर इस तरह की घटनाओं की सदस्यता लेने में सक्षम होना चाहिए क्योंकि मुख्य ऐप में कुछ चीजें/ईवेंट/डेटा अलग-अलग समय पर उपलब्ध हैं।
तो, बहुत सारी जानकारी मैं लिखने से बचने की कोशिश कर रहा था, लेकिन मुझे लगता है कि मेरा मुद्दा मेरे मुद्दे के संबंध में बहुत सामान्य था।
अगर किसी के पास सुझाव हैं तो कृपया मुझे बताएं। दोबारा, मेरा लक्ष्य प्लगइन को मुख्य ऐप में एक ईवेंट ट्रिगर करने की अनुमति देना है, मुख्य ऐप को समाप्त करने की प्रतीक्षा करें, फिर इसके निष्पादन के साथ जारी रखें, जहां मुख्य ऐप घटनाओं की सदस्यता ले सकता है या नहीं।
अद्यतन 2
मुझे पता है ऊपर की जानकारी अपने आवेदन करने के लिए विशेष है, लेकिन मैं सामान्य सुझाव के लिए देख रहा हूँ के रूप में अच्छी तरह से। इसलिए, यदि थ्रेड का उपयोग करना एक विकल्प है, तो मुझे बताएं कि एक सामान्य मामला कैसे काम कर सकता है। यदि कोई और मामला बेहतर काम करेगा और मुझे इसे लागू करने के लिए कुछ नया डिजाइन करने की ज़रूरत है तो मुझे यह भी बताएं। बस यहां सुझावों की तलाश है। धन्यवाद।
नाम पाइप, EventWaitHandle, WCF, दूरस्थ। एक उठाओ :) आपको जो करने की ज़रूरत है उसके आधार पर, वह चुनें जो आपको सबसे साफ कोड देता है। –
आप @Mike सही रास्ते पर कर रहे हैं, कि ऑब्जर्वर पद्धति का उपयोग कर रहा है। आपको शायद कुछ मोटे किनारों को लोहे की जरूरत है। @ मिकाएल, डब्ल्यूसीएफ और अन्य प्रक्रिया आईपीसी के लिए कोई ज़रूरत नहीं है। दूसरा ऐप डोमेन मुख्य एप्लिकेशन द्वारा मेजबान है, इसलिए यह प्रक्रिया संचार में है। –
@Shiv कुमार - द्वारा ऑब्जर्वर आप मतदान प्लगइन क्या मतलब है? –