2011-01-08 11 views
6

डोमेन ईवेंट को कार्यान्वित करते समय ईवेंट हैंडलर को केवल डोमेन की चिंताओं के लिए उपयोग किया जाना चाहिए; कुछ ऐसा जो आप व्यवसाय विशेषज्ञों के साथ चर्चा करेंगे, या वे डोमेन मॉडल में रूचि रखने वाले किसी भी चीज़ द्वारा उपयोग किए जाने के लिए खुले हैं?डोमेन इवेंट हैंडलर - क्या उन्हें एप्लिकेशन परत चिंताओं के लिए उपयोग किया जाना चाहिए?

यह शायद एक साधारण उदाहरण के साथ सबसे अच्छा समझाया गया है, कर्मचारियों को काम शेड्यूल करने के लिए कैलेंडर आवेदन पर विचार करें।

हम निम्नलिखित डोमेन घटनाओं हो सकता है ...

AppointmentRemoved AppointmentContentChanged AppointmentMoved

हम इन घटनाओं के लिए संचालकों है, उदाहरण के लिए जब एक नियुक्ति कर्मचारियों के बाहर एक समय में ले जाया जाता AppointmentAdded कामकाजी घंटों हम एक चेतावनी झंडा सेट।

निश्चित रूप से ऐसी घटनाएं हैं जो इन घटनाओं में रुचि रखते हैं, उदा। जब कैलेंडर में नियुक्ति जोड़ा जाता है, तो हमें इसे कार्य इकाई में जोड़ना चाहिए ताकि हम बाद में परिवर्तन कर सकें।

क्या इन अनुप्रयोगों को डोमेन घटनाओं के उपभोक्ता होने चाहिए, या क्या हमें इसके बजाय अलग सिस्टम घटनाओं को उठाया जाना चाहिए?

उत्तर

5

डीडीडी समाधान में घटनाओं का उपयोग करने के 2 अच्छी तरह से स्थापित तरीके हैं।

पहला वाला उडी दहन के articles about events पर आधारित है। यदि आपने उन्हें पहले से नहीं पढ़ा है, तो मैं अत्यधिक अनुशंसा करता हूं। संक्षेप में यह कहता है कि सामान्य ओआरएम-शैली व्यवहार के अलावा आप स्थिर वर्ग का उपयोग करके अपनी घटनाओं को प्रकाशित करते हैं। इसलिए आप ईवेंट को प्रकाशित करने के लिए ग्राहक के ऑर्डर संग्रह और पर ऑर्डर जोड़ते हैं। चूंकि आपके डोमेन व्यवहार को लेनदेन के दायरे में निष्पादित किया जाता है, इसलिए ईवेंट हैंडलर भी होते हैं। आप वहां एक यूनिट ऑफ वर्क को मैन्युअल रूप से ऑब्जेक्ट संलग्न करने के लिए सलाह और सलाह भी पा सकते हैं। मौजूदा कुल पर व्यवहार का आह्वान करके नई कुल जड़ें बनाई जानी चाहिए।

ग्रेग यंग द्वारा प्रचारित एक और विकल्प है। यह घटना सोर्सिंग पर आधारित है जो मूल रूप से घटनाओं का उपयोग स्थायी राज्य के साधनों के रूप में कर रहा है। इस दृष्टिकोण में आपकी कुल जड़ें आमतौर पर घटनाओं को लागू करने के लिए कुछ बुनियादी ढांचे (जैसे आधार कुल रूट वर्ग) का उपयोग करती हैं। आवेदन कुल रूट क्लास और पर एक ईवेंट हैंडलर को एक बस पर इस घटना को प्रकाशित करता है (जो भी बस कार्यान्वयन आप उपयोग करते हैं)।

+3

मुझे संदेह है कि वे उसी लेनदेन में ईवेंट हैंडलिंग को बढ़ावा देते हैं, जो उस घटना को फायर कर रहे हैं। जैसा कि मुझे याद है कि उडी निर्दिष्ट करता है कि कुल लेनदेन को "आग लगाना और भूलना" बेहतर होता है, खासकर उन मामलों में जब ईवेंट हैंडलरों के पास डोमेन (पूर्व: ईमेल संदेश) से कोई लेना देना नहीं होता है। "आग और भूलने" का अर्थ है कि श्रोताओं को संदेश प्राप्त होने पर आपको परवाह नहीं है, लेकिन आपको किसी संदेश को आग लगाना चाहिए (संदेश भेजें)। कुल मिलाकर एक संदेश भेजें जब कुल मिलाकर यह काम खत्म हो गया है: राज्य परिवर्तन + दृढ़ता। इसलिए मैं दृढ़ता के बाद एक घटना को आग लगाने के लिए उत्सुक हूं। – Tudor

+2

पीएस एक घटना को कुल मिलाकर किसी भी समय निकाल दिया जा सकता है, लेकिन वास्तविक संदेश वितरण को समग्र दृढ़ता के बाद संभाला जाना चाहिए (या एक विशिष्ट आदेश के बाद, जिसने घटना को ट्रिगर किया है, समाप्त हो गया है)। – Tudor

2

यदि आप का मतलब है कि क्रॉस-कटिंग चिंताओं की तुलना में आपको इसका उपयोग करने के लिए मजबूर किया जाएगा, यदि आपके एप्लिकेशन तर्क की आवश्यकता है। तो यह अन्य घटना प्रसंस्करण कोड के साथ मिश्रित किया जाएगा।

लेकिन अगर आपको अलग-अलग ईवेंट हैंडलर (चिंता सिद्धांत का पृथक्करण देखें) का उपयोग करने के लिए बेहतर तरीके से आपके डोमेन ईवेंट की तुलना में कई स्वतंत्र चीजें करने की आवश्यकता है।

पहले मामले में, वैसे, घटना-प्रसंस्करण (आधारभूत संरचना) तर्क के साथ मिश्रण डोमेन तर्क से बचने का प्रयास करें। डोमेन विधियों को कॉल करने वाले ईवेंट हैंडलर में बाएं बुनियादी ढांचे/क्रॉस-कटिंग चिंताओं कोड। डोमेन ऑब्जेक्ट्स 'विधियों के अंदर डोमेन कोड ले जाएं।

+0

यह उचित लगता है, लेकिन यह डोमेन घटनाओं को बढ़ाने के बारे में एक नया सवाल उठता है। आइए मान लें कि कैलेंडर में अपॉइंटमेंट जोड़ना लेनदेन में किया जाता है, इकाई को यूनिटऑफवर्क में जोड़ना लेनदेन के भीतर किया जाना चाहिए, लेकिन यूआई को अपडेट करना लेनदेन के बाहर किया जाना चाहिए। इस मामले में, क्या लेनदेन के भीतर डोमेन इवेंट उठाया जाना चाहिए?और यूआई अपडेट किसी अन्य डोमेन इवेंट हैंडलर में किया जाना चाहिए जो यह असिंक काम करता है। – Andronicus

+1

डोमेन ईवेंट कुछ ऐसा हुआ जो पहले से हुआ है। इसलिए ईवेंट हैंडलर के भीतर लेनदेन को रोलबैक करने की कोई क्षमता नहीं होनी चाहिए। कमिट लेनदेन तब लेनदेन के दौरान भेजे गए सभी कार्यक्रमों के लिए इवेंट हैंडलर को कॉल करें। –

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

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