2017-01-12 11 views
6

मैं सिर्फ ग्रेग यंग्स घटना सोर्सिंग पर बात देख रहा गया है, लेकिन मैं जहां व्यापार तर्क में फिट बैठता है के रूप में उलझन में हूँ एक साधारण उदाहरण:।इवेंट सोर्सिंग - डोमेन लॉजिक कहां फिट है?

1) Shopping Cart Created 
2) Item Added 
3) Item Added 
4) Promotional Code - 20% Off 

प्रचारक कोड है शॉपिंग कार्ट वस्तुओं और के लिए गणना की एक घटना के रूप में संग्रहीत परिणाम। मैं समझता हूं "प्रोमोशनलकोड एडडेडेंट" शायद समझ में आएगा, लेकिन गणित कहां होता है? मैं सोच रहा हूं:

public void AddPromotionalCode(PromotionalCode code) 
{ 
    //perform calculation against shopping cart items. 
    //if valid 
    ApplyChanges(cmd); 
} 

तब परिणाम कहीं भी खत्म नहीं होता है और रीड मॉडल को गणना करना होगा।

मैं अवधारणा को पूरी तरह से समझ नहीं रहा हूं, कोई भी मदद महान होगी।

+0

अगर यह मददगार है मैं एक ब्लॉग पोस्ट जो एक ठेठ CQRS और ES आवेदन देता है और यह कैसे एक साथ फिट बैठता है। आप इसे यहां देख सकते हैं [सीक्यूआरएस + इवेंट सोर्सिंग - चरण अवलोकन द्वारा एक कदम] (http://danielwhittaker.me/2014/10/02/cqrs-step-step-guide-flow-typical-application/) – Codescribler

उत्तर

1

उदाहरण के लिए, आप PromotionalCodeApplied जैसे दूसरे ईवेंट को बढ़ा सकते हैं जिसमें गणना परिणाम शामिल हैं।

रीड मॉडल तो बस पूर्व-गणना परिणाम का उपयोग करना होगा।

+0

हाय अलेक्जेंडर , इसलिए प्रत्येक आइटम को जोड़ा जाने के बाद, क्या आइटम एडेडएवेंट में शॉपिंग कार्ट की पूरी कीमत भी होगी? – TBD

+0

हाँ, यह काम करेगा या आप एक अलग "शॉपिंगकार्डटॉटलप्रिस चेंज" ईवेंट का उपयोग करना चाहेंगे, जो आइटम या प्रोमो-कोड जोड़े जाने पर उठाया जाता है। –

0

यह वह जगह है जहां मैं कमांड विधियों से ईवेंट वापस करना पसंद करता हूं। अलेक्जेंडर लैंगर उल्लेख किया है, आप "गणित" लागू करते हैं और प्रासंगिक घटना (रों) वापसी चाहते हैं:

public PromotionalCodeApplied AddPromotionalCode(PromotionalCode code) 
{ 
    //perform calculation against shopping cart items. 
    var promotionalCodeApplied = new PromotionalCodeApplied(code.VoucherNumber, discountAmount, DateTime.Now); 

    On(promotionalCodeApplied); 

    return promotionalCodeApplied; 
} 

public void On(PromotionalCodeApplied promotionalCodeApplied) 
{ 
    _voucherNumber = promotionalCodeApplied.VoucherNumber; 
    _discountAmount = promotionalCodeApplied.DiscountAmount; 
    _discountDate = promotionalCodeApplied.DateAppllied; 
} 

अब आप अपने पढ़ने के मॉडल प्रासंगिक मूल्यों की पहुंच है।

3

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

  • एक्स% की छूट खरीद के साथ या एक न्यूनतम खरीद
  • $ एक्स बंद खरीद के बिना:

    तर्क के लिए, मान लें कि आपके इस तरह के रूप में जाना जाता प्रचारक कोड, का एक सरल श्रृंखला है कि के साथ या एक न्यूनतम खरीद के बिना

हम कुछ मान्यताओं, साथ ही कर सकते हैं:

  • एपी romotional कोड एक प्रारंभ दिनांक
  • एक प्रचार कोड एक समाप्ति तिथि

एक प्रचार कोड के आवेदन मुश्किल हो सकता है है है। उन दो परिदृश्यों पर विचार करें जिन्हें हमने परिभाषित किया है। "$ एक्स ऑफ खरीद" तुलनात्मक रूप से सरल है, क्योंकि यह एक निश्चित राशि है। "एक्स% बंद खरीद", हालांकि, अधिक जटिल है। अगर हमारे पास केवल निश्चित राशि थी, तो हम किसी भी थ्रेसहोल्ड मिलने के बाद ही कार्ट में छूट लागू कर सकते थे। प्रतिशत-आधारित छूट के साथ, यदि उपयोगकर्ता दो आइटम जोड़ना था, तो प्रचार कोड जोड़ें, और फिर कोई अन्य आइटम जोड़ें, पदोन्नति पहले ही "लागू" हो चुकी होगी।

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

तो, मेरे पास वास्तव में कई कमांड होंगे जो शामिल होंगे। अनिवार्य रूप से कार्ट के मूल्य को प्रभावित करने वाले किसी भी आदेश छूट राशि को बदल सकते हैं।

  • गाड़ी
  • में एक आइटम जोड़ें में
  • बदलें कार्ट से कोई आइटम निकालें हुई वस्तुओं की मात्रा: इसके लिए मैं छूट राशि तलाश कर रहा होगा आदेशों जिसके लिए पुनर्गणना किया जाना है गाड़ी
  • गाड़ी
  • बदलें प्रचारक कोड गाड़ी

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

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

+1

जोसेफ, प्रतिक्रिया के लिए धन्यवाद कि एक अच्छा विचार है और मुझे विचार के लिए भोजन दिया है। – TBD

1

मुझे समझ में आता है कि "प्रोमोशनलकोड एडडेडेंट" शायद समझ में आएगा, लेकिन गणित कहां होता है?

यह उन आदेशों में होना चाहिए जो शॉपिंग कार्ट में संशोधन करते हैं। ऐसा हर आदेश कुछ विधि जैसे RecalculateTotals() को कॉल करेगा जहां सभी व्यावसायिक तर्क होस्ट किए जाएंगे।

निम्नलिखित स्यूडोकोड पर विचार करें:

public void AddPromotionalCode(PromotionalCode code) 
{ 
    var @event = new PromotionalCodeAdded(code); 
    var amount = RecalculateTotalAmount(extraEvent: @event); 
    @event.TotalAmount = amount; 
    _eventStore.Publish(@event); 
} 

decimal RecalculateTotalAmount(IEvent extraEvent) 
{ 
    var relatedEventTypes = new[] { typeof(PromotionalCodeAdded), typeof(ShoppingCartCreated), typeof(ItemAdded) }; 
    var events = _eventStore.ReadEventsOfTypes(relatedEventTypes); 
    var events = events.Concat(new[] { extraEvent }); 

    //calculation logic goes here based on all related events 
} 
संबंधित मुद्दे