2014-12-19 9 views
6

का उपयोग करते हुए देर बाध्यकारी और साथ में मुझे एक आवश्यकता है कि मैं सोचता हूं मेरे पास समाधान है, लेकिन अगर मैं कुछ खो रहा हूं या सड़क के नीचे विफलता के लिए खुद को स्थापित कर रहा हूं तो इनपुट की सराहना करता हूं।वीबीए

आवश्यकता

एक नए पुस्तकालय (सी # का उपयोग) है कि घटनाओं के माध्यम से अपनी स्थिति को वापस रिपोर्ट में कुछ नए व्यापार तर्क को लागू करें। लाइब्रेरी को मौजूदा वीबीए समाधान से बुलाया जाएगा (अभी तक नहीं बदला जा सकता है)। पुस्तकालय 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 प्रयोग करने के लिए इस समाधान पर भरोसा करने के लिए, और यदि हां है, क्यों?

यदि नहीं, तो क्या कोई विकल्प है जिसे मैं लागू करने के लिए देख सकता हूं (वीबीए का उपयोग न करने से परे, जिसमें मेरे पास इस परिदृश्य में कोई विकल्प नहीं है)?

+0

मैं भी जवाब जानने का नाटक करने वाला नहीं हूं, लेकिन मुझे लगता है कि जब तक दोनों कक्षाएं एक ही इंटरफेस का उपयोग करती हैं, तो आप ठीक हैं। आखिरकार, COM इंटरऑप का उपयोग करते समय ठोस कार्यान्वयन के बजाय इंटरफ़ेस का उपयोग करना आवश्यक है। जहां तक ​​वीबीए का संबंध है, वे वही प्रकार (अनिवार्य रूप से) हैं। रास्ते से वास्तव में दिलचस्प सवाल है। – RubberDuck

उत्तर

2

Private WithEvents Processor...

WithEvents बयान मूल्य घटनाओं की खोज और उन्हें उपलब्ध कोड संचालकों से कनेक्ट करने के निर्देश देता है। जब आप Processor मान प्रारंभ करते हैं, तो आपके पास दृश्य के पीछे निम्न कार्यवाही हो रही हैं: COM सर्वर क्लास जानकारी की जांच करना, उपलब्ध ईवेंट इंटरफ़ेस की पहचान करना, कनेक्शन बिंदु कंटेनर की खोज करना, पाए गए इंटरफ़ेस की घटनाओं से जुड़ना, ईवेंट प्राप्त करने के लिए कॉल वापस देना कहता है।

जब सभी का उल्लेख होता है और सफल होता है, तो COM सर्वर से निकाल की गई घटनाएं आपके हैंडलर तक पहुंच जाती हैं। वीबीएनईटी कोड पक्ष पर कोई अतिरिक्त धारणा नहीं है कि कौन घटनाओं को बिल्कुल लागू करता है, इसलिए जब तक वे कनेक्शन बिंदुओं और कक्षा/प्रकार की जानकारी के साथ वैध COM सर्वर हैं, तब तक सर्वर को स्विच करना ठीक है।

1

जहां तक ​​मैं समझता हूं कि यह कैसे काम करता है, आप अपने अनुमान में सही हैं। जब तक एक "कस्टम" इंजन इंजन की पहुंच वाले वीबीए कोड द्वारा उपयोग की जाने वाली सभी घटनाओं और इंजन के गुणों को उजागर करता है, तब तक आपको कोई समस्या नहीं होगी। मैंने यह कोशिश नहीं की है, लेकिन मुझे यकीन है कि आप मानक वर्ग में कुछ सामान्य घटनाओं और गुणों (केवल नाम में) में निर्माण करके बचाव कर सकते हैं कि आप सक्रिय रूप से कस्टम फॉर्मूलेशन में से किसी एक के साथ सक्रिय रूप से उपयोग कर सकते हैं।