हमें cqrs वास्तुकला में नई समग्र जड़ें कैसे बनानी चाहिए? इस उदाहरण में मैं नया समुच्चय मूल AR2 बनाना चाहता हूं जो पहले एक AR1 के संदर्भ में है।
मैं AR2 विधि का उपयोग करते हुए AR2 को शुरुआती बिंदु के रूप में बना रहा हूं। अब तक मुझे कुछ विकल्प दिखाई देते हैं:
- AR1 में अंदर की विधि
createAr2RootOpt1
मैंnew AR2()
डोमेन सेवा का उपयोग करके db imediatelly को इस ऑब्जेक्ट को कॉल और सेव कर सकता है जिसमें रिपॉजिटरी का आरोप है। मैं पहले एग्रीगेट रूट में घटना का उत्सर्जन कर सकता था।
SholdCreateAR2Event
और फिर स्टेटलेस सागा है जो इस पर प्रतिक्रिया करता है और कमांड को जारीCreateAR2Command
करता है जिसे तब संभाला जाता है और वास्तव में AR2 बनाता है और उत्सर्जित करता हैAR2CreatedEvent
। ईवेंट सोर्सिंग का उपयोग करने के मामलेSholdCreateAR2Event
में इवेंट स्टोर में संरक्षित नहीं किया जाएगा, क्योंकि यह पहले समग्र रूट की स्थिति को प्रभावित नहीं करता है। (या क्या हमें अभी भी इवेंट स्टोर में इसे सहेजना चाहिए?)class AR1{ Integer id; DomainService ds; //OPTION 1 void createAr2RootOpt1(){ AR2 ar2 = new AR2(); ds.saveToRepo(ar2); } //OPTION 2 void createAr2RootOpt2(){ publishEvent(new SholdCreateAR2Event()); //we don't need this event. Shoud it still be preserved in event store? } } class AR2{ Integer id; Integer ar1Id; void handle(CreateAR2Command command){ //init this AR with values and save publishEvent(AR2CreatedEvent()); //used for projections afterwards and saved inside AR2 event store } } class Saga{ void handle(SholdCreateAR2Event ev){ emitCommand(new CreateAR2Command()); } }
ऐसा करने का अधिक उचित तरीका कौन सा है?
AR1WasCreated
? क्या यह होना चाहिएAR2WasCreated
? इसके अलावा, यदि मैं आपके तर्क का उपयोग करता हूं, तो मैंAR2WasCreated
वास्तव में निर्मित होने से पहले घटना का उत्सर्जन करता हूं ? और AR1 के इवेंट लॉग के अंदर इस घटना को सहेजना समस्याग्रस्त लगता है, क्योंकि मुझे वास्तव में AR1 के अंदर इस डेटा की आवश्यकता नहीं है (यह AR1 के अंदर कुछ भी संशोधित नहीं करता है)।