DDD और CRQS का उपयोग करते समय, प्रति कमांड एक ही घटना होनी चाहिए?


17

मैं कॉन्फ़िगरेशन पर कन्वेंशन के साथ एक डीडीडी एप्लिकेशन को डिजाइन करने का तरीका ढूंढ रहा हूं।

कुल मिलाकर कहें तो "क्लाइंट" के पास "फिलप्रोफाइल" परिभाषित एक कमांड है। यह तार्किक रूप से एक घटना "ProfileFilled" बढ़ाएगा।

क्या ऐसे मामले हैं जब कोई कमांड किसी घटना से अधिक बढ़ाएगा, या जहां एक कमांड कुछ तर्क के आधार पर विभिन्न घटनाओं को बढ़ाएगा? या यह हमेशा एक 1 - 1 संबंध है (1 कमांड हमेशा कोई नहीं उठाएगा, या किसी दिए गए प्रकार की एक भी घटना)।

मैं यह इसलिए पूछ रहा हूं क्योंकि अगर यह एक तथ्य है, कि एक कमांड हमेशा एक ही घटना को बढ़ाएगा, तो मैं उस तथ्य पर अपने कन्वेंशन सिस्टम का निर्माण कर सकता हूं। मुझे पता है कि "RaiseEvent" का परिणाम "EventRaised" होगा ...


1
यदि कमांड में 2 चीजें होती हैं, तो आप एक घटना को बढ़ाने के लिए प्रत्येक चीज की उम्मीद कर सकते हैं। ProfileGenerated, ProfileSaved, इसके अलावा किसी भी घटना में एक त्रुटि हो सकती है जो फिर से एक घटना को बढ़ा सकती है
Evan

इसके अलावा, सिस्टम से पहले तुच्छ व्यवस्था को लागू किया जा सकता है, बाद में कोकमांड आदि घटनाएँ
इवान

या कमांड लूप हो सकता है अर्थात FillProfiles () प्रोफाइलफिल्ड, प्रोफाइलफिल्ड ....
Ewan

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

जवाबों:


18

चूंकि आपने "CQRS" के साथ अपने प्रश्न को टैग किया था, इसलिए मुझे लगता है कि आप "CQRS & Event Sourcing" संदर्भ में घटनाओं का मतलब है, जैसे कि यह यहाँ वर्णित है । में इस ट्यूटोरियल , घटनाओं और आदेशों के बीच का अंतर अच्छी तरह से समझाया गया है:

  • ईवेंट आपके सिस्टम में प्राथमिक "चीजों को जो" हो सकता है, को सिस्टम के दृष्टिकोण से कैप्चर करते हैं।

  • कमांड को परिभाषित किया जाता है कि उपयोगकर्ता अपने दृष्टिकोण से, ऑपरेशन के रूप में क्या मानता है

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

उदाहरण के लिए, ट्यूटोरियल घटनाओं का उल्लेख करता है

  • TabOpened
  • DrinksOrdered
  • FoodOrdered

और आज्ञा देता है

  • OpenTab
  • आदेश देना

यहां, कमांड "ओपनटैब" एक इवेंट "टैबऑनडेन" की ओर ले जाएगा, लेकिन कमांड प्लेसऑडर को इवेंट "ड्रिंक्सऑर्डेड", "फूडऑर्डेड", या दोनों की ओर ले जाएगा।

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


10

आमतौर पर एक आदेश एक घटना को जन्म देगा। लेकिन कुछ मामलों में यह एक से अधिक भी हो सकता है, यह आपके कार्यान्वयन पर निर्भर करता है।

या तो आपकी कमांड अन्य कमांड को कॉल करती है और उनमें से प्रत्येक अपने स्वयं के ईवेंट को फायर करता है। या आपका कमांड अपने आप पर अलग-अलग कार्य करता है और कई घटनाओं को जारी करता है। उदाहरण के लिए:

RegisterUserCommand

  • User.create (ईमेल, पासवर्ड) → UserCreatedEvent
  • User.updateProfile (पहला नाम, अंतिम नाम, स्थान) → UserProfileUpdatedEvent
  • User.joinDefaultGroup () → UserJoinedGroupEvent

यदि आप बाद में निर्णय लेते हैं तो क्या होता है UserWasAddedToCrm? अपनी पूरी स्ट्रीम फिर से लिखें?
mcintyre321

@ ऑर्केस्ट्रेटेड घटनाओं बनाम नृत्य खोज mcintyre321
Benten

10

एक आदेश कई घटनाओं को बढ़ा सकता है। यह केवल एक तथ्य का तार्किक निष्कर्ष है: Composite commandमौजूद है।

कहते हैं कि आपके पास दो आदेश हैं, प्रत्येक घटना को बढ़ाता है। फिर, आप उन दोनों की एक समग्र कमांड बनाते हैं। समग्र कमांड का उपयोग करने वाले एक के दृष्टिकोण से, ऐसा लगता है जैसे कमांड ने दो घटनाओं को उठाया।

इसलिए एकल कमांड को कई (या यहां तक ​​कि) घटनाओं को उठाने से रोकना कुछ भी नहीं है।

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