सीक्यूआरएस के बारे में एक बात नहीं है जो मुझे नहीं मिलता है: पढ़े गए मॉडल को कैसे अपडेट किया जाए जब उठाए गए ईवेंट में पढ़ने वाले मॉडल को अपडेट करने के लिए आवश्यक विवरण शामिल न हों।सीक्यूआरएस कार्यक्रमों में पढ़ने के मॉडल को अपडेट करने के लिए आवश्यक विवरण शामिल नहीं हैं
दुर्भाग्य से, यह एक आम परिदृश्य है।
उदाहरण: मैं एक समूह को एक उपयोगकर्ता जोड़ता हूं, इसलिए मैं एक addUserToGroup (userId, groupId) कमांड भेजता हूं। इसे प्राप्त किया जाता है, कमांड हैंडलर द्वारा प्रबंधित किया जाता है, userAddedToGroup ईवेंट बनाया, संग्रहीत और प्रकाशित किया जाता है।
अब, एक ईवेंट हैंडलर इस घटना और दोनों आईडी प्राप्त करता है। अब एक ऐसा दृश्य होगा जो सभी उपयोगकर्ताओं को उनके समूह के नामों के साथ सूचीबद्ध करेगा। उस दृश्य के लिए पढ़ने वाले मॉडल को अपडेट करने के लिए, हमें उपयोगकर्ता आईडी (जो हमारे पास है) और समूह का नाम (जिसे हम नहीं करते हैं ' टी है, हम केवल इसकी आईडी है)।
तो सवाल यह है कि: मैं इस परिदृश्य को कैसे संभाल सकता हूं?
वर्तमान में, चार विकल्प मेरे मन के लिए आते हैं, सभी उनकी विशिष्ट नुकसान के साथ:
पढ़ने मॉडल डोमेन पूछता है। => निषिद्ध, और यहां तक कि संभव नहीं है, क्योंकि डोमेन में केवल व्यवहार है, नहीं (सार्वजनिक) राज्य।
पढ़ा गया मॉडल समूह के नाम को पढ़ने के मॉडल में किसी अन्य तालिका से पढ़ता है। => काम करता है, लेकिन अगर कोई मिलान तालिका नहीं है तो क्या होगा?
घटना के लिए आवश्यक डेटा जोड़ें। => काम नहीं करता है, क्योंकि इसका मतलब है कि मुझे सभी पिछली घटनाओं को भी अपडेट करना था, और मैं यह नहीं देख सकता कि मुझे कौन सा डेटा एक दिन की आवश्यकता हो सकती है।
घटना को "सामान्य" ईवेंट हैंडलर के माध्यम से संभाल न करें, लेकिन ईवेंट स्टोर से संबंधित पृष्ठभूमि में एक ईटीएल प्रक्रिया शुरू करें, निरंतर डेटा बनाता है और पढ़ने वाले मॉडल को लिखता है। => काम करता है, लेकिन मेरे लिए यह एक साधारण परिदृश्य के लिए बहुत अधिक ओवरहेड लगता है।
तो सवाल यह है कि मैं इस परिदृश्य से सही तरीके से कैसे निपटूं?
ठीक है, अब तक, मुझे मिल गया ;-) जो मुझे अभी तक नहीं मिला है: मान लीजिए कि मेरी खरीद ऑर्डर सबमिट की गई घटना _today_ में VAT नहीं है। अब, भविष्य में कुछ समय के लिए तेजी से आगे बढ़ें, जहां मैं करता हूं। बेशक मैं एक नया कार्यक्रम बना सकता हूं, मूल रूप से वी 2.0, जिसमें VAT शामिल है - लेकिन यह अतीत के सभी आदेशों में मेरी सहायता नहीं करता है, है ना? मैं उससे कैसे निपटूं? –
आप मॉडल की संरचना और घटनाओं की संरचना को एक-दूसरे से स्वतंत्र रूप से बदल सकते हैं। एक बार आपके मॉडल को जानकारी के एक नए टुकड़े (वैट जैसे) द्वारा बढ़ाया जाता है, पुराने ईवेंट के हैंडलर बस रहते हैं या नई संपत्ति को डिफ़ॉल्ट मान पर सेट करते हैं। जैसे ही आप डेटाबेस तालिका में नया कॉलम जोड़ते समय करेंगे: नया कॉलम सभी अपरिवर्तनीय प्रविष्टियों के लिए या तो शून्य या कुछ डिफ़ॉल्ट पर सेट होना चाहिए। जब भी कोई ईवेंट रीप्ले या रीड मॉडल को हाइड्रेट करने के लिए उपयोग किया जाता है तो नया फ़ील्ड आपको जो भी डिफ़ॉल्ट मान चाहिए, उसे सेट किया जाएगा। –
ठीक है, धन्यवाद, यह समझ में आता है :-)! –