2009-09-25 11 views
6

DDDस्मृति परिवर्तन में सीक्यूएस को कैसे कार्यान्वित करें?

http://www.infoq.com/interviews/greg-young-ddd

पर ग्रेग Yound द्वारा इस वीडियो को देखे जाने मैं सोच रहा था कि कैसे आप DDD के साथ कमान-क्वेरी पृथक्करण (CQS) को लागू कर सकता है आप स्मृति परिवर्तन में है जब?

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

वीडियो में आदेश हमेशा डेटाबेस पर जाते हैं, और इसलिए आप अद्यतन डेटा लाने और स्क्रीन पर फिर से चलाने के लिए क्वेरी भंडार का उपयोग कर सकते हैं।

क्या आप एएसपी.नेट में स्क्रीन की तरह कुछ संपादित करने और संपादित करने के साथ सीक्यूएस का उपयोग कर सकते हैं, जहां मेमोरी में बदलाव किए जाते हैं और डेटाबेस में परिवर्तनों को जारी रखने से पहले स्क्रीन को कई बार अद्यतन करने की आवश्यकता होती है?

उदाहरण के लिए

  1. मैं क्वेरी रिपोजिटरी से एक प्रश्न वस्तु लाने के लिए और स्क्रीन पर प्रदर्शित
  2. मैं संपादित करें पर क्लिक
  3. मैं क्वेरी वस्तु भंडार से एक प्रश्न वस्तु को फिर से लाएं और पर प्रदर्शित संपादन मोड
  4. मैं फॉर्म पर एक मान बदलता हूं, जो ऑटोपॉस्ट वापस करता है और कमांड ऑब्जेक्ट लाता है और प्रासंगिक कमांड
  5. क्या करना है: मुझे अब अपडेट को प्रदर्शित करने की आवश्यकता है टेड ऑब्जेक्ट कमांड ने गणना की गई फ़ील्ड में बदलाव किए हैं। चूंकि कमांड ऑब्जेक्ट को डेटाबेस में सहेजा नहीं गया है, इसलिए मैं क्वेरी रिपॉजिटरी का उपयोग नहीं कर सकता। और सीक्यूएस के साथ मैं स्क्रीन पर प्रदर्शित करने के लिए कमांड ऑब्जेक्ट के आकार का पर्दाफाश करने के लिए नहीं हूं। स्क्रीन पर प्रदर्शित होने वाले अपडेट किए गए परिवर्तनों के साथ आप क्वेरी ऑब्जेक्ट को वापस कैसे प्राप्त करेंगे।

कुछ संभावित समाधान जो मैं सोच सकता हूं, एक सत्र भंडार, या कमांड ऑब्जेक्ट से क्वेरी ऑब्जेक्ट प्राप्त करने का एक तरीका है। या सीक्यूएस इस प्रकार के परिदृश्य पर लागू नहीं होता है?

ऐसा लगता है कि वीडियो में परिवर्तन सीधे डेटाबेस तक जारी रहेगा, और मुझे सीक्यूएस के साथ डीडीडी का एक उदाहरण नहीं मिला है जो डोमेन ऑब्जेक्ट में बैचिंग परिवर्तनों के मुद्दे को संबोधित करता है और दृश्य को अपडेट करता है अंततः डोमेन ऑब्जेक्ट को सहेजने के लिए कमांड जारी करने से पहले संशोधित डोमेन ऑब्जेक्ट।

उत्तर

1

यदि आप वास्तव में इसके लिए सीक्यूएस का उपयोग करना चाहते हैं, तो मैं कहूंगा कि क्वेरी रेपो और लिखित रेपो दोनों में एक ही बैकिंग स्टोर का संदर्भ है।आम तौर पर यह संदर्भ बाहरी डेटाबेस के माध्यम से होता है - लेकिन आपके मामले में यह एक सूची < टी > या इसी तरह की हो सकती है।

+1

उत्तर के लिए धन्यवाद। मैं सोच रहा हूं कि डेटाबेस में सीधे बने रहने के बजाय, स्मृति में परिवर्तन होने पर सीक्यूएस का उपयोग करने के लिए यह कितना आम/अच्छा है? यह मूल रूप से हमने सत्र रिपॉजिटरीज़ का उपयोग करने के लिए किया है ताकि क्वेरी रिपोजिटरी को सत्र चर के माध्यम से कमांड डेटा तक पहुंचने की अनुमति मिल सके। शायद बाद में HttpContext रिपॉजिटरीज़ की आवश्यकता है। क्या किसी ने इसे पहले लागू किया है? विचारों की सराहना की। – Ian

+0

मेरी राय में, डेटा स्रोत में हेरफेर करने के लिए उपयोग की जाने वाली विधि को डेटा स्रोत के प्रकार पर भरोसा नहीं करना चाहिए। रिपोजिटरी पैटर्न आपको इन मतभेदों को दूर करने की इजाजत देता है, जिससे आप किसी भी डेटा स्रोत का इलाज कर सकते हैं जैसे कि यह ऑब्जेक्ट्स का एक क्वेरी करने योग्य संग्रह था।लक्ष्य डेटा स्रोत निर्धारित करने के लिए यह व्यक्तिगत भंडार कार्यान्वयन पर निर्भर करता है - इसलिए सिद्धांत में आपके पास 'इनमेमरी रिपोजिटरी' और 'डेटाबेस रिपोजिटरी' होगा - या आप क्या हैं। –

+0

हाँ मैं समझता हूं कि आप डाटाबेस रिपोजिटरी के लिए इनमेमरी रिपोजिटरी को स्वैप कर सकते हैं। सीक्यूएस के मूल्य का हिस्सा यह है कि आप डेटाबेस को कमांड जारी करते हैं, और अलग-अलग डेटा को क्वेरी रिपोजिटरी के साथ वापस खींचते हैं। स्मृति में कमांड ऑब्जेक्ट सत्र में होता है, इसलिए क्वेरी रिपॉजिटरी केवल कमांड ऑब्जेक्ट में डेटा खींच सकता है। डेटाबेस संस्करण के साथ क्वेरी ऑब्जेक्ट कमांड ऑब्जेक्ट के लिए पूरी तरह से अलग हो सकता है, बस स्मृति सीक्यूएस के साथ लगता है कि रिश्ते बहुत करीब है। यह आश्चर्यजनक है कि सीक्यूएस – Ian

0

स्मृति में, आप आमतौर पर Observer design pattern का उपयोग करेंगे।

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

+0

सुनिश्चित नहीं की आपूर्ति करता है, तो आप मेरे सवाल का मिलता है। सीक्यूएस के साथ आप लिखने से पाठ को अलग कर रहे हैं। जहां प्रश्न भंडार लिखना भंडार से अलग है। इसलिए यदि मैं डोमेन इकाई को भंडार में सहेजता नहीं हूं, तो क्वेरी रिपॉजिटरी डेटा कैसे प्राप्त कर सकता है? क्या मुझे डोमेन ऑब्जेक्ट से अद्यतन ऑब्जेक्ट से क्वेरी ऑब्जेक्ट प्राप्त करने का कोई तरीका चाहिए, या आप कह रहे हैं कि एक क्वेरी ऑब्जेक्ट डोमेन ऑब्जेक्ट का निरीक्षण करेगा और खुद को अपडेट करेगा? या संभवतः एक सत्र भंडार शुरू करें? – Ian

0

Unit of WorkPatterns of Enterprise Application Architecture से डिजाइन पैटर्न सीक्यूएस बहुत अच्छी तरह से मेल खाता है - यह मूल रूप से एक बड़ा कमांड है जो डेटाबेस में सामान बना रहता है।

+0

लिंक के लिए धन्यवाद, लेकिन अभी भी मेरे प्रश्न का उत्तर नहीं देता है। मूल रूप से सीक्यूएस के साथ आपके पास एक ऑब्जेक्ट है जिसमें केवल विधियां (कमांड) हैं, और एक अन्य ऑब्जेक्ट जिसमें ऑब्जेक्ट का आकार होता है। दो रिपॉजिटरीज़ हैं, एक कमांड ऑब्जेक्ट के लिए, और एक क्वेरी ऑब्जेक्ट के लिए। तो आप स्क्रीन ऑब्जेक्ट का उपयोग करने के लिए कमांड ऑब्जेक्ट का उपयोग कभी नहीं करते हैं, इसके बजाय आप क्वेरी ऑब्जेक्ट का उपयोग करते हैं। डेटाबेस पर कमांड ऑब्जेक्ट के परिवर्तनों को सहेजने के बिना, आप आदेशों को कॉल करके किए गए परिवर्तनों को फिर से कैसे चलाते हैं? चूंकि परिवर्तन डेटाबेस में नहीं हैं, इसलिए आप क्वेरी रिपॉजिटरी का उपयोग नहीं कर सकते हैं। – Ian

3

तो यह आपके जैसा लगता है कि यह एक और अधिक बारीक कमांड है।

ईजी: उपयोगकर्ता वेब पेज के साथ इंटरैक्ट करता है (मान लें कि एक शॉपिंग कार्ट के साथ चेक आउट करना)।

जानकारी प्राप्त करने वाले एकाधिक पेज कमांड का निर्माण कर रहे हैं। आदेश तब तक नहीं भेजा जाता जब तक उपयोगकर्ता वास्तव में जांचता है कि डोमेन पर एक ही कमांड में सभी जानकारी भेजी जाती है, चलो इसे "चेकऑट" कमांड कहते हैं।

प्रस्तुति मॉडल इस प्रकार की बातचीत को सारणीबद्ध करने में काफी सहायक हैं।

उम्मीद है कि इससे मदद मिलती है।

ग्रेग

+0

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

1
अपनी चिंताओं से बाकी के लिए

भी ...

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

+0

यह सुनिश्चित नहीं है कि यह अभी तक मेरी स्थिति पर लागू होता है, अभी तक केवल एक डेटाबेस है, इसलिए रिपोर्टिंग स्टोर को अपडेट करने के बारे में चिंता करने की ज़रूरत नहीं है, और कमांड ऑब्जेक्ट्स NHibernate का उपयोग करते हैं, इसलिए परिवर्तन डेटाबेस पर वापस आते हैं। या यह मेरी स्थिति पर लागू होता है? निश्चित नहीं है कि आप किस चिंता का जिक्र करते हैं? – Ian

-2

JdonFramework CQRS DDD जावा ढांचा है, यह एक डोमेन घटनाओं + अतुल्यकालिक पैटर्न, अधिक जानकारी के https://jdon.dev.java.net/

संबंधित मुद्दे