ट्रिगर नहीं किया गया है मैं प्रिज्म के साथ एक ईवेंट एकत्रीकरण को लागू करने पर काम कर रहा हूं। मेरे पास कुछ मॉड्यूल हैं, और मैं चाहता हूं कि उनमें से प्रत्येक घटनाओं की सदस्यता लें जो उन्हें अनुरोध करते समय बताए। मैंने खोल में सब्सक्राइब और प्रकाशक दोनों के साथ एक सादा उदाहरण शुरू कर दिया। वहां कोई समस्या नहीं है। अभी व; जब मैं ग्राहकों को अपने मॉड्यूल में ले जाता हूं तो वे ट्रिगर नहीं होते हैं। और भी अजीब बात यह है कि यह वास्तव में कुछ बार काम करता है - जिनमें से सभी को ब्रेकपॉइंट में लंबित किया गया है। तो मुझे लगता है कि मुझे कुछ दौड़ की स्थिति है, लेकिन मुझे समझ में नहीं आता क्यों।प्रिज्म इवेंट एकत्रीकरण - ग्राहक
अनुमान लगाया गया: मुझे कहीं भी आईवेन्टएग्रेगेटर सेट अप करने की आवश्यकता नहीं है - उदा। आईओसी कंटेनर में पंजीकरण? यह प्रिज्म में बनाया गया है कि मेरे पास केवल ईवेंट एग्रीगेटर का एक उदाहरण है, है ना?
तो, सवाल मूल रूप से कैसे/कहाँ/जब मुझे अपने ग्राहकों को स्थापित करना चाहिए। सामान आदि पर एक विशिष्ट आदेश है? मेरे सरलीकृत उदाहरण में मेरे पास एक मॉड्यूल MyModule है। Bootstrapper सूची को MyModule जोड़ना होगा - यह प्रारंभ बनाने:
catalog.AddModule(typeof(MyModule));
MyModule एग्रीगेटर की दुकान और MyModuleRequestedEvent की सदस्यता के लिए इस का उपयोग करेगा। यह एप्लिकेशन मेनू में पंजीकरण के लिए मेनू रजिस्ट्री का भी उपयोग करता है। विचार यह है कि अंततः मेनू में क्लिक करने से ईवेंट ट्रिगर होना चाहिए - MyModule को सूचित करना कि अनुरोध किया गया है। तो मैं यह जानना चाहता हूं कि आगे क्या करना है यह जानने के लिए यह MyModule की ज़िम्मेदारी है।
public MyModule(IEventAggregator aggregator, IApplicationMenuRegistry menu)
{
_applicationMenu = menu;
_aggregator = aggregator;
}
public void Initialize()
{
var evnt = _aggregator.GetEvent<MyModuleRequestedEvent>();
evnt.Subscribe(MyModuleRequested);
_applicationMenu.RegisterMenuItem("MyModule", evnt);
}
public void MyModuleRequested(bool b)
{
MessageBox.Show("MyModule requested");
}
अब, मेरे पास मेरे खोल में एक बटन है जो इस घटना को प्रकाशित करेगा। हल होने पर खोल को वही (?) ईवेंट एग्रीगेटर मिल जाता है।
public Shell(IEventAggregator aggregator)
{
InitializeComponent();
var evnt = aggregator.GetEvent<MyModuleRequestedEvent>();
EventTriggerButton.Click += (s, e) => evnt.Publish(true);
}
नोट्स:
- जांच लिया है कि घटना प्रकाशित हुआ है। खोल में एक ग्राहक जोड़ना भी इस ग्राहक को घटना प्राप्त करेगा।
- फिर से; MyModule में ग्राहक ट्रिगर नहीं किया गया है। हालांकि, यह आश्चर्यजनक रूप से - कुछ मौकों पर रहा है।
- मैं इस कार्यक्रम में इनपुट का उपयोग नहीं करता हूं। ऐसा लगता है कि आपको कुछ इनपुट-प्रकार रखने की आवश्यकता है, इसलिए मैं बस एक डमी बूल के साथ गया। क्या मैं इससे छुटकारा पा सकता हूं ..?
ऐसा लगता है जैसे आपको दो EventAggregators मिल रहे हैं; उनके लिए ऑब्जेक्ट आईडी बनाने के लिए डीबगर का उपयोग करें ताकि आप जांच सकें और हमें बता सकें। – GraemeF
टिप के लिए धन्यवाद! क्या यह था, और वास्तव में यह वही EventAggregator है जिसका उपयोग मॉड्यूल में सदस्यता लेने और प्रकाशन के लिए किया जाता है। पहले शेल कन्स्ट्रक्टर में मिला। क्या "ऑब्जेक्ट आईडी बनाएं" था। मिला 1 #। फिर MyModule में ब्रेकपॉइंट मारा। प्रारंभ करें, और सत्यापित करें कि एग्रीगेटर में आईडी 1 # था। साथ ही प्रकाशित करने के लिए बटन को मारने पर भी मुझे लगता है कि इस्तेमाल किया गया एग्रीगेटर 1 # है। – stiank81