मैं एक .NET आधारित अनुप्रयोग बना रहा हूं, और एक अधिक विस्तारणीय और प्लग करने योग्य डिज़ाइन की अनुमति देना चाहता हूं।अनुमोदित सी # प्लगइन्स आवेदन हुक पर पंजीकरण
सादगी के लिए, आवेदन के संचालन और घटनाओं का एक सेट को उजागर करता है:
- DoSomething()
- DoOtherThing()
- OnError
- onSuccess
मैं लोड होने के लिए "प्लगइन्स" पेश करना और इन परिचालनों में से कुछ में हुक करना चाहते हैं (कुछ ऐसा है: जब ईवेंट 1 आग लगती है, प्लगइन 1 चलाएं)।
उदाहरण के लिए - plugin1.HandleError() जब OnError घटना आग चलाते हैं।
इस घटना को सदस्यता के साथ आसानी से किया जा सकता है:
this.OnError += new Plugin1().HandleError();
समस्या यह है कि यह है:
- मेरा ऐप प्रकार "Plugin1" का पता नहीं है (यह एक प्लगइन है, मेरे ऐप सीधे इसका संदर्भ नहीं देता है)।
- ऐसा करने से पहले प्लगइन को तुरंत चालू कर दिया जाएगा, कुछ मैं नहीं करना चाहता हूं।
"पारंपरिक" प्लगइन मॉडल में, एप्लिकेशन (प्लगइन का "क्लाइंट" लोड करता है और कुछ महत्वपूर्ण बिंदुओं पर प्लगइन कोड निष्पादित करता है। उदाहरण के लिए - एक निश्चित प्रसंस्करण अनुप्रयोग, जब एक निश्चित ऑपरेशन किया जाता है)।
प्लगइन कोड को तुरंत चालू करने के लिए और इसे निष्पादित करने का नियंत्रण क्लाइंट एप्लिकेशन के लिए जाना जाता है।
मेरे आवेदन में, प्लगइन स्वयं यह तय करना है कि इसे कब निष्पादित करना चाहिए ("प्लगइन ऑनरर ईवेंट पर पंजीकृत होना चाहिए")।
"पंजीकरण" कोड के साथ प्लगइन "निष्पादन" कोड को रखना एक मुद्दा है कि प्लगइन डीएलएल के साथ पंजीकरण समय पर स्मृति में लोड हो जाएगा, जो कुछ मैं रोकना चाहता हूं।
उदाहरण के लिए, यदि मैं प्लगइन डीएलएल में एक रजिस्टर() विधि जोड़ता हूं, तो प्लगइन डीएलएल को रजिस्टर विधि के लिए स्मृति में लोड करना होगा।
इस विशेष मुद्दे के लिए एक अच्छा डिजाइन समाधान क्या हो सकता है?
- प्लगइन डीएलएल के आलसी लोडिंग (या आलसी/उत्सुक लोडिंग की पेशकश)।
- प्लगइन को नियंत्रित करने के लिए सिस्टम/ऐप के विभिन्न हिस्सों को नियंत्रित करने के लिए अनुमति देना।
असेंबली लोड करते समय इस रणनीति की कमी बहुत धीमी है। .Net –
में प्रतिबिंब के लिए यह सामान्य समस्या है धन्यवाद, मुझे पहले से ही यह पता है कि यह कैसे करें। मैं जो डिज़ाइन करना चाहता हूं वह प्लगइन को कुछ घटनाओं पर पंजीकृत करने की अनुमति देने का एक तरीका है, इसे पहले से लोड किए बिना। –
मुझे लगता है कि यह वास्तव में लोड होने तक * कुछ भी * प्लगइन डीएलएल के लिए संभव नहीं है। एक समाधान प्लगइन सेट अप करने वाली प्रत्येक प्लगइन असेंबली में एक प्लगइन परिभाषा वर्ग डालना है/मेजबान को इसकी क्षमताओं के बारे में बताता है। जब आपका एप्लिकेशन शुरू होता है तो आप सभी परिभाषा कक्षाएं पा सकते हैं और उचित कार्रवाई कर सकते हैं (शायद प्रत्येक पर "कॉन्फ़िगर करें" विधि को कॉल करना)। –