डोमेन ईवेंट का उपयोग करने, या एप्लिकेशन लेयर को सब कुछ ऑर्केस्ट्रेट करने देने के बीच चयन कैसे करें


27

मैं अपना पहला कदम डोमेन संचालित डिजाइन में स्थापित कर रहा हूं, नीली किताब और सभी खरीदा है, और मैं एक निश्चित समाधान को लागू करने के तीन तरीके देख रहा हूं। रिकॉर्ड के लिए: मैं CQRS या इवेंट सोर्सिंग का उपयोग नहीं कर रहा हूं।

मान लीजिए कि एक उपयोगकर्ता अनुरोध एप्लिकेशन सेवा परत में आता है। उस अनुरोध के लिए व्यावसायिक तर्क (जो भी कारण के लिए) एक इकाई पर एक विधि, और एक डोमेन सेवा पर एक विधि में अलग हो गया है। मुझे उन तरीकों को कॉल करने के बारे में कैसे जाना चाहिए?

मैंने अब तक जो विकल्प इकट्ठे किए हैं, वे हैं:

  • एप्लिकेशन सेवा को दोनों विधियों को कॉल करने दें
  • इकाई में डोमेन सेवा को इंजेक्ट करने के लिए विधि इंजेक्शन / डबल डिस्पैच का उपयोग करें, इकाई को ऐसा करने दें और फिर इसे डोमेन सेवा की विधि (या दूसरे तरीके से, डोमेन सेवा को इकाई पर कॉल करने दें) को कॉल करने दें
  • इकाई विधि में एक डोमेन ईवेंट उठाएँ, जिसके एक हैंडलर को डोमेन सेवा कहते हैं। (मैं जिस तरह के डोमेन ईवेंट की बात कर रहा हूं, वे हैं: http://www.udidahan.com/2009/06/14/domain-events-salvation/ )

मुझे लगता है कि ये सभी व्यवहार्य हैं, लेकिन मैं उनके बीच चयन करने में असमर्थ हूं। मैं इस बारे में लंबे समय से सोच रहा हूं और मैं एक ऐसे बिंदु पर आ गया हूं जहां मुझे अब तीनों के बीच शब्दार्थ अंतर दिखाई नहीं देता। क्या आप कुछ दिशा-निर्देशों के बारे में जानते हैं कि कब क्या उपयोग करना है?


1
डोमेन घटनाओं पर जानकारी के लिए दिलचस्प लिंक के लिए धन्यवाद।
JW01

क्या इन दोनों विधियों को एक विशिष्ट क्रम में बुलाया जाना चाहिए?
स्पेसट्रूकर

@SpaceTrucker मेरे विशिष्ट मामले में यह वास्तव में मायने नहीं रखता। लेकिन प्रत्येक विकल्प में मैंने खुद का उल्लेख किया है कि यदि कोई चाहे तो तरीकों के निष्पादन का आदेश देना संभव है।
डीवीडीवैल

जवाबों:


19

एप्लिकेशन सेवा को दोनों विधियों को कॉल करने दें

एप्लिकेशन सेवा आमतौर पर इसके लिए एक शानदार शुरुआती स्थान है, हालांकि आपको हमेशा व्यवहार को यथासंभव इकाई के करीब स्थानांतरित करने का प्रयास करना चाहिए। एप्लिकेशन सेवा एक ऑर्केस्ट्रेटिंग भूमिका निभाती है और यह डोमेन व्यवहार को निष्पादित करने के लिए चरण निर्धारित करती है और जैसे कि यह सभी आवश्यक निर्भरता प्रदान करती है। हालाँकि, जब संभव हो, तो इसे डोमेन मॉडल में व्यवहार को सौंपना चाहिए।

इकाई में डोमेन सेवा को इंजेक्ट करने के लिए विधि इंजेक्शन / डबल डिस्पैच का उपयोग करें, इकाई को ऐसा करने दें और फिर इसे डोमेन सेवा की विधि (या दूसरे तरीके से, डोमेन सेवा को इकाई पर कॉल करने दें) को कॉल करने दें

यह एक बेहतर दृष्टिकोण है क्योंकि व्यवहार का अधिक हिस्सा इकाई या डोमेन सेवा को सौंपा गया है। इसे लागू करने का सबसे निर्णायक तरीका यह है कि एक इकाई को एक सेवा पर निर्भरता व्यक्त करने के लिए एक विधि के पैरामीटर के रूप में व्यवहार को हाथ में प्रदान करना है।

इकाई पद्धति में एक डोमेन ईवेंट उठाएँ, जिसके एक हैंडलर को डोमेन सेवा कहा जाता है।

डोमेन इवेंट पैटर्न, जैसा कि उदी द्वारा समझाया गया है और खुद इवांस भी, काफी बहुमुखी है और इसे विभिन्न परिदृश्यों में लागू किया जा सकता है। हालांकि इसके साथ कुछ जटिलताएँ हैं। सबसे पहले, आपको यह सुनिश्चित करना होगा कि आपके पास डोमेन ईवेंट प्रकाशक के भीतर उचित स्कूपिंग है। अधिकांश समय, आपके डोमेन ईवेंट हैंडलर्स पर निर्भरताएं होंगी और यदि आप IoC कंटेनर का उपयोग कर रहे हैं, तो आपको यह सुनिश्चित करना होगा कि एक उचित इंस्टेंस इंजेक्ट किया गया हो। उदाहरण के लिए, वेब अनुप्रयोग में,[ThreadStatic]स्कूपिंग के लिए विशेषता समस्याग्रस्त है। एक और जटिलता ट्रांसक्रिप्शनल सीमाओं की है। आपको लेन-देन को ध्यान में रखना होगा, क्योंकि यदि कोई इकाई एक डोमेन इवेंट उठाती है, लेकिन डेटाबेस के लिए बाद में प्रतिबद्ध विफल रहता है, तो सभी डोमेन ईवेंट हैंडलर को वापस रोल करने के लिए एक रास्ता की आवश्यकता होगी, अन्यथा आप एक अमान्य ईवेंट को बढ़ाएँगे। यदि फिर भी आपने इन ठिकानों को ढँक लिया है, तो डोमेन ईवेंट्स स्वयं के अंदर संस्थाओं में डोमेन लॉजिक को इनकैप्सुलेट करने के लिए एक बेहतरीन पैटर्न है।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.