लघु संस्करणगतिशील विधानसभा संकल्प/प्रबंधन
मैं एक आवेदन जो एक प्लग-इन बुनियादी ढांचे का इस्तेमाल करता है। प्लग-इन में कॉन्फ़िगर करने योग्य गुण होते हैं जो उन्हें को अपना काम करने में मदद करते हैं। प्लग-इन को कार्य को पूरा करने के तरीके को परिभाषित करने के लिए प्रोफाइल में समूहित किया जाता है, और प्रोफ़ाइल को डेटाकंट्रैक्टसेरियलाइज़र द्वारा क्रमबद्ध XML फ़ाइलों में संग्रहीत किया जाता है। समस्या तब होती है जब कॉन्फ़िगरेशन फ़ाइलों को पढ़ते हैं, एप्लिकेशन deserializing को कॉन्फ़िगरेशन फ़ाइल में परिभाषित सभी प्लग-इन का ज्ञान होना चाहिए। मैं अज्ञात प्लग-इन के संकल्प को संभालने का एक तरीका ढूंढ रहा हूं। मैंने लागू किए गए कुछ विचारों के लिए नीचे प्रस्तावित समाधान अनुभाग देखें, लेकिन मैं बस कुछ भी करने के लिए खुला हूं (हालांकि मुझे एप्लिकेशन को फिर से शुरू करने की आवश्यकता नहीं है)।
विस्तार
पृष्ठभूमि
मैं कंपनी मैं वर्तमान में सी # में के लिए काम कर रहा हूँ के लिए आंतरिक उपयोग के लिए बिजनेस प्रोसेस ऑटोमेशन सिस्टम का एक प्रकार विकसित किया है 4. यह बनाता है को परिभाषित करने के लिए 'प्लग-इन' का संपूर्ण उपयोग (कार्य की इकाइयों की परिभाषा में किए जाने वाले कार्यों से) और गतिशील कॉन्फ़िगरेशन मॉडल पर भारी निर्भर करता है जो बदले में सी # 4/नौकरियों को पूरा करने के लिए डीएलआर गतिशील वस्तुओं। इसकी गतिशील प्रकृति के कारण निष्पादन करते समय यह थोड़ा भारी होता है लेकिन यह लगातार काम करता है और हमारी आवश्यकताओं के लिए पर्याप्त प्रदर्शन करता है।
इसमें एक WinForms कॉन्फ़िगरेशन UI शामिल है जो प्लग-इन के कॉन्फ़िगर करने योग्य गुण/फ़ील्ड्स को निर्धारित करने के लिए प्रतिबिंब का व्यापक रूप से उपयोग करता है, साथ ही साथ गुण/फ़ील्ड जो कार्य की प्रत्येक इकाई को संसाधित करने के लिए परिभाषित करता है। यूआई को बीपीए इंजन के शीर्ष पर भी बनाया गया है, इसलिए इसकी जगह (ढीला) ऑब्जेक्ट मॉडल की पूरी तरह से समझ है जो इंजन को अपनी नौकरी करने की इजाजत देता है, जो संयोग से, कई उपयोगकर्ता अनुभव सुधारों को जन्म देता है, जैसे कि , उपयोगकर्ता इनपुट के विज्ञापन-कार्य निष्पादन और कॉन्फ़िगर-टाइम सत्यापन। फिर सुधार के लिए जगह है, हालांकि, ऐसा लगता है कि यह अपना काम करता है।
कॉन्फ़िगरेशन UI निर्दिष्ट सेटिंग्स को क्रमबद्ध/deserialize करने के लिए DataContractSerializer का उपयोग करता है, इसलिए कॉन्फ़िगरेशन द्वारा संदर्भित किसी भी प्लग-इन को कॉन्फ़िगरेशन लोड से पहले (या उस समय) लोड किया जाना चाहिए।
संरचना
BPA इंजन एक साझा विधानसभा (DLL) जो BPA सेवा (Windows सेवा), विन्यास यूआई (WinForms अनुप्रयोग) द्वारा संदर्भित है के रूप में कार्यान्वित किया जाता है, और एक प्लग-इन परीक्षक (विंडोज सेवा का कंसोल अनुप्रयोग संस्करण)। साझा असेंबली का संदर्भ देने वाले तीनों में से प्रत्येक एप्लिकेशन में केवल अपने विशिष्ट उद्देश्य को करने के लिए आवश्यक न्यूनतम मात्रा में कोड शामिल होता है। इसके अतिरिक्त, सभी प्लग-इन को एक बहुत ही पतली असेंबली का संदर्भ देना चाहिए जो मूल रूप से प्लगइन को लागू करने वाले इंटरफ़ेस को परिभाषित करता है।
समस्या
क्योंकि आवेदन में इस्तेमाल किया तानाना मॉडल की, वहाँ हमेशा एक आवश्यकता है कि config यूआई सेवा आवेदन के रूप में (एक ही पीसी पर) एक ही निर्देशिका से चलाया जाता है किया गया है। इस तरह यूआई हमेशा उन सभी असेंबली के बारे में जानता है जिन्हें सेवा के बारे में पता है, इसलिए उन्हें गायब असेंबली में भाग दिए बिना deserialized किया जा सकता है।अब जब हम सिस्टम से बाहर निकलने के करीब आ रहे हैं, तो हमारे नेटवर्क में किसी भी पीसी पर कॉन्फ़िगरेशन UI को दूरस्थ रूप से अनुमति देने की मांग सुरक्षा उद्देश्यों के लिए हमारे नेटवर्क व्यवस्थापक से आ गई है। आम तौर पर यह एक समस्या नहीं होगी यदि हमेशा तैनात करने के लिए असेंबली का ज्ञात सेट होता है, हालांकि, उपयोगकर्ता निर्मित असेंबली का उपयोग करके एप्लिकेशन का विस्तार करने की क्षमता के साथ, उन असेंबली को हल करने का एक तरीका होना चाहिए जिससे प्लग-इन तत्काल/इस्तेमाल किया जा सकता है।
प्रस्तावित (संभावित स्पष्ट) समाधान
सेवा आवेदन करने के लिए एक WCF सेवा जोड़े विन्यास जो सेवा की है कि उदाहरण के बारे में पता है के खिलाफ ठेठ CRUD संचालन अनुमति देने के लिए और अधिक कार्य करने के लिए विन्यास यूआई rework एक कनेक्ट/डिस्कनेक्ट मॉडल के साथ एसएसएमएस की तरह। यह वास्तव में समस्या को हल नहीं करता है, इसलिए हमें सेवा अनुप्रयोग से किसी प्रकार की सेवा नियंत्रण का खुलासा करने की आवश्यकता होगी ताकि उन असेंबली की पूछताछ की अनुमति मिल सके जो इसके बारे में जानते हैं/जिनके पास पहुंच है। यह ठीक और काफी सीधे आगे है हालांकि सवाल उठता है, "यूआई को उन विधानसभाओं के बारे में कब पता होना चाहिए जिन्हें सेवा के बारे में पता है?" कनेक्ट पर हम सभी असेंबली को सेवा से यूआई में भेज सकते हैं ताकि यह सुनिश्चित किया जा सके कि यह हमेशा सेवा के सभी असेंबली के बारे में जानता है लेकिन यह ऐपडोमेन प्रबंधन (संभावित रूप से अनावश्यक रूप से) और असेंबली संस्करण संघर्षों के साथ गन्दा हो जाता है। तो मैंने ऐपडोमेन में हुकिंग का सुझाव दिया। एस्प्लोरर रीसोलव/ऐपडोमेन। टाइप केवल उन असेंबली को डाउनलोड करने के लिए करें जिन्हें क्लाइंट अभी तक और केवल आवश्यकतानुसार नहीं जानता है। यह ऐपडोमेन प्रबंधन मुद्दों को जरूरी नहीं है लेकिन यह निश्चित रूप से संस्करण विवादों और संबंधित मुद्दों को हल करने में मदद करता है।
प्रश्न
तुम मेरे साथ अटक गया है इस लंबी मैं सराहना और धन्यवाद, लेकिन अब मैं अंत में यहाँ वास्तविक प्रश्न के हो रही है। महीनों के शोध के बाद और अंततः एक निष्कर्ष पर आ रहा है, मुझे आश्चर्य है कि अगर किसी को यहां एक समान मुद्दे से निपटना पड़ा है और आपने नुकसान और कमियों से कैसे निपटना है? क्या इसे संभालने का एक मानक तरीका है कि मैंने पूरी तरह से याद किया है, या क्या आपने इस बारे में कोई सिफारिशें की हैं कि आपने इसे पहले से सफलतापूर्वक कैसे संभाला है? क्या आप प्रस्तावित दृष्टिकोण के साथ कोई समस्या देखते हैं या आप एक विकल्प प्रदान कर सकते हैं?
मुझे पता है कि हर कोई मेरे सिर में नहीं रहता है, इसलिए अगर आपको और स्पष्टीकरण/स्पष्टीकरण की आवश्यकता है तो कृपया मुझे बताएं। धन्यवाद!
अद्यतन
मैं MEF एक निष्पक्ष शेक दिया जाता है और लगता है कि यह मेरी प्रयोजनों के लिए बहुत साधारण है है। ऐसा नहीं है कि यह मेरे आवेदन की प्लग-इन आवश्यकताओं को संभालने के लिए तैयार नहीं हो सकता है, समस्या यह कर रही है ताकि इसे व्यवहार्य बनाने के लिए बहुत बोझिल और गंदा हो। यह एक अच्छा सुझाव है और इसमें बहुत सी संभावनाएं हैं, लेकिन वर्तमान स्थिति में यह अभी तक नहीं है।
मेरे प्रस्तावित समाधानों पर कोई अन्य विचार या प्रतिक्रिया?
अद्यतन
अगर मैं ठीक से वर्णन करने के लिए मैं क्या हासिल करने की कोशिश कर रहा हूँ में विफल रहा है मैं, यदि समस्या मैं का सामना कर रहा हूँ अभी भी स्थानीय है पता नहीं है, या अगर यह सवाल अभी भी अनुचित रूप से लंबा है पूरी तरह से पढ़ने के लिए; लेकिन मुझे प्राप्त कुछ उत्तरों काफी मददगार हैं जो मुझे समस्या के माध्यम से अलग-अलग सोचने में मदद करने के लिए पर्याप्त हैं और मैं जो कुछ भी कर रहा हूं उसमें कुछ कमियों की पहचान करता हूं।
संक्षेप में, मैं जो करने की कोशिश कर रहा हूं वह तीन अनुप्रयोगों को लेता है जो एक सामान्य निर्देशिका संरचना का उपयोग कर अपने वर्तमान राज्य साझा जानकारी (कॉन्फ़िगरेशन/असेंबली) में हैं, और उन अनुप्रयोगों को नेटवर्क पर कम से कम प्रभाव के साथ काम करने का प्रयास करें प्रयोज्यता और वास्तुकला।
फ़ाइल शेयरों जब कुछ गलत हो जाता है उन्हें नियंत्रण और debugability की कमी में तब्दील हो का उपयोग कर इस समस्या का स्पष्ट जवाब की तरह लग (@SimonMourier टिप्पणी में प्रस्तावित), लेकिन। मैं उन्हें एक व्यवहार्य अल्पकालिक समाधान के रूप में देख सकता हूं, लेकिन दीर्घकालिक वे केवल व्यवहार्य प्रतीत नहीं होते हैं।
+1 एक अच्छी तरह से वर्णित प्रश्न के लिए! –
क्षमा करें अगर यह बेवकूफ लगता है, लेकिन क्या आप अपने प्लगइन असेंबली को शेयर पर केंद्रीय रूप से तैनात नहीं कर सकते हैं (और अधिकार और सीएएस ठीक हैं) किसी भी प्रक्रिया (सेवा, कॉन्फ़िगर इत्यादि) से उन्हें इस शेयर से लोड करते हैं? अन्य प्रश्न जब मैं इसमें हूं, तो क्या आप सिस्टम के शांत लेकिन छोटे ज्ञात सेट के बारे में जानते हैं। नामस्थान जोड़ें: http://msdn.microsoft.com/en-us/library/gg145020.aspx? –
@ सिमोन मॉरीयर - सुझावों के लिए धन्यवाद। हां, मैंने एमएएफ के बारे में सुना है, लेकिन जब मैं अपना खुद लिखता हूं तो यह बहुत भारी है। फ़ाइल शेयर पर प्लग-इन को तैनात करने के लिए, मैंने माना कि लगभग 5 सेकंड के लिए और यह शायद काम कर सकता है लेकिन यह सिर्फ गंदा लगता है। मुझे लगता है कि मैं एक अधिक एकीकृत समाधान पसंद करूंगा (कम शब्दों में: मैं एक कोडर हूं इसलिए मैं कुछ कोड करना चाहता हूं)। –