का उपयोग करते हुए देर बाध्यकारी और साथ में मुझे एक आवश्यकता है कि मैं सोचता हूं मेरे पास समाधान है, लेकिन अगर मैं कुछ खो रहा हूं या सड़क के नीचे विफलता के लिए खुद को स्थापित कर रहा हूं तो इनपुट की सराहना करता हूं।वीबीए
आवश्यकता
एक नए पुस्तकालय (सी # का उपयोग) है कि घटनाओं के माध्यम से अपनी स्थिति को वापस रिपोर्ट में कुछ नए व्यापार तर्क को लागू करें। लाइब्रेरी को मौजूदा वीबीए समाधान से बुलाया जाएगा (अभी तक नहीं बदला जा सकता है)। पुस्तकालय COM इंटरऑप के माध्यम से वीबीए के संपर्क में है - यहां कोई समस्या नहीं है।
इस नई लाइब्रेरी द्वारा उजागर "आधार" कार्यक्षमता के अतिरिक्त, मुझे आधार कार्यक्षमता को सड़क के नीचे "कस्टम" कार्यक्षमता द्वारा प्रतिस्थापित करने की अनुमति देने की आवश्यकता है।
आधार और कस्टम कार्यक्षमता दोनों एक ही इंटरफ़ेस को लागू करेंगे, लेकिन प्रत्येक के आंतरिक निजी तरीके विभिन्न कारणों से अलग होंगे।
VBA
में मैं या तो आधार पुस्तकालय या कस्टम पुस्तकालय (और शायद है कि भविष्य में एक ही इंटरफ़ेस को लागू अन्य कस्टम पुस्तकालयों) आह्वान करने में सक्षम होने की जरूरत है। यदि पुस्तकालयों से संदेशों का जवाब देने और प्रदर्शित करने की आवश्यकता के लिए नहीं था, तो मैं रनटाइम पर ऑब्जेक्ट को तुरंत चालू करने के लिए देर बाध्यकारी का उपयोग कर सकता था। हालांकि, चूंकि मुझे पुस्तकालयों द्वारा उठाए गए कार्यक्रमों का जवाब देने की आवश्यकता है, इसलिए मुझे VBA में चर घोषित करते समय WithEvents
कीवर्ड का उपयोग करने की आवश्यकता है।
यदि मैं केवल मैं निम्नलिखित की तरह कुछ कर सकता है आधार पुस्तकालय का समर्थन करने के लिए किया था:
Private WithEvents Processor As MyDefault.RuleEngine
Public Sub Execute(StartDate As Date, EndDate As Date, SomeOtherParms As String)
Set Processor = New MyDefault.RuleEngine
Processor.Execute StartDate, EndDate, SomeOtherParms
End Sub
Private Sub Processor_OnProgressUpdate(ByVal percentComplete As Double)
'Show the progress on the UI to the user
End Sub
जब से मैं इस पुस्तकालय का रिवाज कार्यान्वयन (जिनमें से कुछ मैं अब के बारे में पता समर्थन करने के लिए है, दूसरों कि मुझे अभी तक पता नहीं है) मैं इस परिदृश्य को संभालने के लिए देर से बाध्यकारी उपयोग करने के लिए की तरह होगा।
हालांकि, साथियों के साथ देर बाध्यकारी के साथ उपयोग नहीं किया जा सकता है, हालांकि मैं एक कामकाज पर ठोकर खा सकता हूं।
मेरे परिदृश्य में, मैं हमेशा आधार कार्यान्वयन का संदर्भ रखूंगा। यह केवल विशिष्ट, कॉन्फ़िगर किए गए परिस्थितियों में होगा जहां आधार कार्यक्षमता को कस्टम कार्यान्वयन द्वारा प्रतिस्थापित किया जाएगा।
के बाद से आधार और कस्टम पुस्तकालय (एँ) एक ही इंटरफ़ेस का हिस्सा है, मैं निम्नलिखित कोड अवधारणा का एक सबूत में काम कर रहा है:
Private WithEvents Processor As MyDefault.RuleEngine
Public Sub Execute(StartDate As Date, EndDate As Date, SomeOtherParms As String)
If CustomConditionIsMet Then
'In real-life we'll look this info up from a table or config file
Set Processor = CreateObject("MyCustom.RuleEngine")
Else
Set Processor = New MyDefault.RuleEngine
End If
Processor.Execute StartDate, EndDate, SomeOtherParms
End Sub
Private Sub Processor_OnProgressUpdate(ByVal percentComplete As Double)
'Show the progress on the UI to the user
End Sub
इस कार्यान्वयन त्रुटियों के बिना काम करता है (दोनों संकलन और रनटाइम पर), लेकिन मैं इस समाधान का आगे बढ़ने के बारे में थोड़ा संकोच कर रहा हूं क्योंकि मुझे ऐसा नहीं लगता कि मुझे यह समझ में आता है कि यह वास्तव में कैसे काम करता है। मेरा संदेह यह है कि यह काम करता है क्योंकि बेस और कस्टम लाइब्रेरी दोनों एक ही इंटरफ़ेस साझा करते हैं, इसलिए COM CreateObject
कथन के माध्यम से देर से बाइंडिंग के साथ "खुश" है, लेकिन मुझे डर है कि मैं यहां क्या खो सकता हूं जो संभावित रूप से मुझे दुःख का कारण बनता है सड़क के नीचे।
मेरे प्रश्न
यह "सुरक्षित" लेट बाइंडिंग WithEvents
प्रयोग करने के लिए इस समाधान पर भरोसा करने के लिए, और यदि हां है, क्यों?
यदि नहीं, तो क्या कोई विकल्प है जिसे मैं लागू करने के लिए देख सकता हूं (वीबीए का उपयोग न करने से परे, जिसमें मेरे पास इस परिदृश्य में कोई विकल्प नहीं है)?
मैं भी जवाब जानने का नाटक करने वाला नहीं हूं, लेकिन मुझे लगता है कि जब तक दोनों कक्षाएं एक ही इंटरफेस का उपयोग करती हैं, तो आप ठीक हैं। आखिरकार, COM इंटरऑप का उपयोग करते समय ठोस कार्यान्वयन के बजाय इंटरफ़ेस का उपयोग करना आवश्यक है। जहां तक वीबीए का संबंध है, वे वही प्रकार (अनिवार्य रूप से) हैं। रास्ते से वास्तव में दिलचस्प सवाल है। – RubberDuck