समस्याअलग-अलग ऐपडोमेन के साथ प्लगइन और बहुतायत समर्थन के साथ एएसपी.नेट एमवीसी अनुप्रयोग?
मैं प्लग में/मॉड्यूल वास्तुकला और बहु किरायेदारी समर्थन के साथ एक ASP.NET MVC 3 आवेदन किया है। एमईएफ का उपयोग निर्भरताओं को हल करने और प्लग करने योग्य भागों को लोड करने के लिए किया जाता है।
प्रत्येक मॉड्यूल में नियंत्रक, विचार और अन्य वस्तुएं होती हैं (भौतिक रूप से यह एक असेंबली होती है)। मॉड्यूल किरायेदारों में लोड कर रहे हैं।
सरल विन्यास इस प्रकार दिखाई देंगे:
किरायेदार 1:
- मॉड्यूल एक, 1.0 संस्करण (ModuleA.dll)
- मॉड्यूल बी, 1.0 संस्करण (ModuleB.dll)
किरायेदार 2:
- मॉड्यूल बी, 1.0 संस्करण (ModuleB.dll)
Dll के विभिन्न मॉड्यूल और विभिन्न संस्करणों के लिए अलग भौतिक स्थानों में अलग से जमा हो जाती है। और एप्लिकेशन एक ऐपडोमेन (डिफ़ॉल्ट एक) पर चल रहा है।
हालांकि, अगर हम कॉन्फ़िगरेशन करना चाहते हैं जहां विभिन्न किरायेदार विभिन्न मॉड्यूल संस्करणों का उपयोग करते हैं, तो हमें अलग-अलग संस्करण में समान असेंबली लोड करने में समस्या आती है। जिसका अर्थ है कि नीचे दिया गया परिदृश्य पूरी तरह से काम नहीं कर रहा है क्योंकि मॉड्यूलबी से हल करने के प्रकारों के दौरान हमें रचना मिस्चैच अपवाद मिला (संस्करण 1.0 और 1.5 एमईएफ में लोड किया गया था लेकिन असेंबली लोडर द्वारा ऐपडॉमेन में केवल एक असेंबली लोड की गई है)।
किरायेदार 1:
- मॉड्यूल एक, 1.0 संस्करण (ModuleA.dll)
- मॉड्यूल बी, 1.0 संस्करण (ModuleB.dll)
किरायेदार 2:
- मॉड्यूल ए, संस्करण 1.5 (ModuleB.dll)
समाधान?
तो हम एक समाधान के साथ आए, जो अलग-अलग किरायेदारों और उनके मॉड्यूल/असेंबली को अलग-अलग ऐपडोमेन्स में लोड करता है। मतलब है कि हमारे उदाहरण से Tenant1 और Tenant2 को AppDomain1 और AppDomain2 में लोड किया गया है। एएसपी मेंनेट MVC पाइपलाइन हम उचित अनुप्रयोग डोमेन है, जो इस प्रकार दिखाई देगा का चयन करने में नियंत्रक कारखाने में झुका:
- अनुरोध डिफ़ॉल्ट AppDomain (एक है कि वेब अनुप्रयोग शुरू कर दिया)
- नियंत्रक कारखाना द्वारा नियंत्रित किया जाता
- अनुरोध से Tenant_Id ले जाता है और उचित AppDomain से उचित नियंत्रक का समाधान करता है (हम Tenant_Id-> किरायेदार> AppDomain संबंध)
- रिटर्न ControllerProxy (जो एक प्रॉक्सी वर्ग कि IController लागू करता है और MarshalByRefObject विरासत में शेष भाग पारित करने के लिए सक्षम होने के लिए है दूसरा एप्लिकेशन Domians के बीच रोलर)
- अनुरोध से Tenant_Id ले जाता है और उचित AppDomain से उचित नियंत्रक का समाधान करता है (हम Tenant_Id-> किरायेदार> AppDomain संबंध)
- कार्रवाई Invoker
- उचित कार्रवाई नियंत्रक प्रॉक्सी वस्तु पर शुरू हो जाती है और अभी निष्पादन
- अंतर्निहित एप्लिकेशन डोमेन के में जगह लेता है और यहाँ हम इस समस्या टकरा क्योंकि एक्शन इनवॉकर किसी अन्य ऐप डोमेन पर serializable RequestContext को पास करने में सक्षम नहीं है (दूसरे शब्दों में नियंत्रकप्रॉक्सी.एक्सक्यूट (RequestContext संदर्भ) क्रमबद्धता के बारे में अपवाद फेंक रहा है)
प्रश्न (ओं):
- कैसे एक अच्छा तरीका में एप्लिकेशन डोमेन के बीच RequestContext (गैर serializable ऑब्जेक्ट) पारित करने के लिए?
- क्या अंतर्निहित ऐप डोमेन (नियंत्रक फैक्ट्री से पहले) पर निष्पादन को पुनर्निर्देशित करने के लिए पाइपलाइन में एक और चरण में शामिल होना संभव है?
- या इस समस्या के लिए किसी अन्य समाधान के बारे में कोई विचार?
बात यह है कि हमें अलग-अलग किरायेदारों में प्लगइन के विभिन्न संस्करणों को लोड करने में सक्षम होना चाहिए (अभी भी एक ही वेब एप्लिकेशन में होना) और जैसा कि मैंने समझ लिया है कि आपके द्वारा वर्णित प्लगइन सिस्टम ऐसे परिदृश्यों को संभाल नहीं पाता है। या? – untoldex
यह संभव नहीं है। आप एक ही एपडोमेन में विभिन्न असेंबली संस्करणों का उपयोग नहीं कर सकते हैं, और एएसपी.नेट ऐपडोमेन का प्रबंधन करता है। यदि आप अन्य ऐप डोमेन का उपयोग करने का प्रयास करते हैं तो आपको खेद होगा। – jgauffin
असल में आप एक ही एपडोमेन में विभिन्न असेंबली संस्करणों का उपयोग कर सकते हैं - बिना किसी संदर्भ के असेंबली लोड करके - बाइट सरणी (असेंबली.लोड (बाइट []) से)। मैं वर्तमान में इसे काम करने की कोशिश कर रहा हूं लेकिन एमईएफ के साथ समस्याएं ... – untoldex