2011-04-21 9 views
6

का उपयोग कर मैं इस पैटर्न को एक नई परियोजना में लागू करने का प्रयास कर रहा हूं जैसा कि उडी दहन द्वारा वर्णित है।डोमेन इवेंट पैटर्न

मुझे इस विचार को पसंद है लेकिन मुझे अभी तक पूरा यकीन नहीं है कि किस मामले में इसे लागू किया जाना चाहिए (इस सामग्री के लिए नया ...)।

उदाहरण के लिए कहें कि मेरे पास OnUserCreated एक ईवेंट है। मैं चाहता हूं कि हैंडलर में से एक उपयोगकर्ता को एक पुष्टिकरण ईमेल भेजें। लेकिन अगर घटना को निकाल दिया जाता है तो ईमेल भेजा जाता है और फिर लेनदेन करने में त्रुटि होती है और डेटा डेटाबेस में कभी भी सहेजा नहीं जाता है। क्या इस स्थिति में पैटर्न लागू है? मैंने लोगों को यह नहीं पढ़ा है कि कुछ परियोजनाएं जो मैंने खत्म की हैं, वास्तव में ऐसा करते हैं। या यह कुछ है जो मुझे केवल अन्य संस्थाओं को लोड और अपडेट करने के लिए उपयोग करना चाहिए ... दूसरी तरफ मैंने किसी को यह कहते हुए पढ़ा है कि ऑपरेशन के लिए आवश्यक संबंधित इकाइयां पहले ही लोड होनी चाहिए, इसलिए मुझे उन्हें डेटाबेस से लोड नहीं करना चाहिए घटना।

उत्तर

7

यह निश्चित रूप से इस बात पर निर्भर करता है कि आप अपने सिस्टम को कैसे कार्यान्वित करना चुनते हैं।

आप एक से अधिक विकल्प यहाँ पर विचार कर सकते हैं:

1. दो चरण के लिए प्रतिबद्ध जब एक दो चरण कर प्रतिबद्ध, मूल रूप से हर हैंडलर 3 तरीकों में शामिल हैं: एक तैयार करने के लिए, एक प्रतिबद्ध करने के लिए और रोल करने के लिए एक वापस।

सभी ईवेंट हैंडलर के लिए, तैयार को पहले कहा जाता है। यदि उनमें से कोई भी समस्या की रिपोर्ट नहीं करता है, तो सभी हैंडलर 'Commit() विधियों को बुलाया जाता है। यदि उनमें से कोई भी समस्या की रिपोर्ट करता है - तैयार() कॉल द्वारा किसी भी समस्या की रिपोर्ट नहीं होने के बावजूद - तब उन सभी हैंडलर जिनके Commit() को पहले ही निष्पादित कर दिया गया है, आप उनके रोलबैक() विधियों को कॉल करते हैं।

2. आंतरिक और बाहरी घटना हैंडलर एक और विकल्प ईवेंट हैंडलर को अलग करना है। आप UserCreated जैसे किसी ईवेंट को प्रकाशित कर सकते हैं, जिसे ईवेंट हैंडलर द्वारा संसाधित किया जाता है जो पहले लेनदेन में भाग लेते हैं। लेनदेन के हिस्से के रूप में घटना डीबी में जमा हो जाती है। फिर आपके पास बाहरी ईवेंट हैंडलर हो सकते हैं जो केवल उन घटनाओं पर प्रतिक्रिया करते हैं जो डीबी में पहले से संग्रहीत हैं - जैसे आपका ईमेल प्रेषक। प्रारंभिक लेनदेन के बाद ही इन्हें बुलाया जा सकता है।

मुझे यकीन है कि आप अपने विशिष्ट परिदृश्य को संभालने के अधिक तरीकों के बारे में सोच सकते हैं।

3

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

Begin Transaction 
    Receive Command 
    Call Aggregate Method 
     Publish Events // will only be published if the transaction succedes 
Commit Transaction 

Begin Transaction 
    Receive Event 
    Send Email 
End Transaction 

अपने घटनाओं नाम के लिए एक तरफ ध्यान दें कोशिश के रूप में, के बाद से यह उनके वाक्यों में उपयोग करने के लिए आसान है:

आपका प्रवाह कुछ इस तरह दिखना चाहिए।

संबंधित मुद्दे