कमान संचालकों और DDD


11

मेरे पास ASP.NET MVC एप्लिकेशन है, जो डेटा प्राप्त करने के लिए एक क्वेरी सेवा और कमांड भेजने के लिए एक कमांड सेवा का उपयोग करता है। मेरा प्रश्न कमांड भाग के बारे में है।

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

ठोस उदाहरण: AddCommentToArticleCommandHandler एक AddCommentToArticleCommand प्राप्त करता है, जिसमें एक ArticleId, CommentText और EmailAddress है।

प्रथम; सत्यापन को घटित करना होता है, जैसे: - जाँच करें कि क्या लेख मौजूद है - जाँच करें कि क्या लेख बंद तो नहीं है - जाँच करें कि क्या टिप्पणी पाठ में और 20 से 500 वर्णों के बीच भरा है - जाँच करें कि क्या ईमेल पता भरा हुआ है और उसका वैध प्रारूप है।

मैं सोच रहा हूँ कि यह सत्यापन कहाँ रखा जाए?

1 / कमांड हैंडलर में ही। लेकिन फिर, इसे अन्य कमांड हैंडलर में पुन: उपयोग नहीं किया जा सकता है।

2 / डोमेन इकाई में। लेकिन एक डोमेन संस्था को रिपॉजिटरी या सेवाओं के बारे में पता नहीं है, यह आवश्यक सत्यापन नहीं कर सकता है (यह जांच नहीं कर सकता है कि कोई लेख मौजूद है)। लेकिन दूसरी तरफ, यदि इकाई में तर्क नहीं होते हैं, तो यह एक साधारण डेटा कंटेनर बन जाता है, जो DDD सिद्धांतों का पालन नहीं कर रहा है।

3 / कमांड हैंडलर सत्यापनकर्ताओं का उपयोग करता है, ताकि अन्य कमांड हैंडलर में सत्यापन का पुन: उपयोग किया जा सके।

4 / अन्य तंत्र?

मैं इस विशेष उदाहरण के लिए जिम्मेदारियों की श्रृंखला की तलाश कर रहा हूं और इसमें क्या वस्तुएं (संस्थाएं, रिपॉजिटरी, ...) एक भूमिका निभाती हैं।

क्या आपके पास इस बारे में विचार हैं कि आप इसे कैसे लागू करेंगे, कमांड हैंडलर से रिपॉजिटरी तक?


"लेकिन एक डोमेन इकाई के रूप में रिपॉजिटरी या सेवाओं के बारे में नहीं पता है, यह आवश्यक सत्यापन नहीं कर सकता है"? क्यों नहीं? डीडीडी के किस सिद्धांत के लिए यह आवश्यक है?
एस.लॉट

मैं हर जगह पढ़ता हूं कि किसी संस्था को रिपॉजिटरी या कुछ और के बारे में नहीं जानना चाहिए।
एल-फोर

क्या आप कोई उद्धरण, लिंक या उदाहरण प्रदान कर सकते हैं - विशेष रूप से - आपने पढ़ा है? हमें नहीं पता कि आप जो डीडीडी पढ़ रहे हैं उसका क्या वर्णन है।
एस.लॉट


जिमी बोगार्ड
Mayo

जवाबों:


4

मुझे लगता है कि आपको इस मामले में दो प्रकार के सत्यापन को अलग करने की आवश्यकता है; डोमेन सत्यापन और आवेदन सत्यापन

आवेदन सत्यापन वह है जो आपके पास है जब आप यह सत्यापित करते हैं कि कमांड प्रॉपर्टी 'टेक्स्ट' 20 और 200 अक्षरों के बीच है; इसलिए आप इसे GUI के साथ और एक दृश्य-मॉडल-सत्यापनकर्ता के साथ मान्य करते हैं जो POST के बाद सर्वर पर भी निष्पादित होता है। वही ई-मेल (btw) के लिए जाता है, मुझे आशा है कि आप महसूस करेंगे कि `32.d +" Hello World .42 "@ mindomän.local जैसे ई-मेल RFC के अनुसार एक मान्य है)।

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

उपरोक्त मामले में, आपके पास अवसंरचना होगी जो जहर संदेशों को संभालती है - वे उदाहरण के लिए संदेश को 1-5 बार पुन: प्रयास करेंगे और फिर इसे एक कविता कतार में ले जाएंगे जहां आप मैन्युअल रूप से संदेशों के संग्रह का निरीक्षण कर सकते हैं और उन प्रासंगिकों को फिर से भेज सकते हैं। निगरानी करना अच्छी बात है।

तो अब हमने चर्चा की है:

  • आवेदन सत्यापन

    • जीयूआई में जावास्क्रिप्ट के साथ
    • वेब सर्वर पर एमवीसी-मान्यता के साथ
  • अनुपलब्ध मूल + विष कतार

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

घटना एक संदेश ब्रोकर या आपके कस्टम डिस्पैचर पर एक संदेश के रूप में हो सकती है। वेब सर्वर, यदि एप्लिकेशन अखंड है, तो एक सफलता की घटना और उल्लेखित विफलता घटना दोनों के लिए समान रूप से सुन सकता है और उपयुक्त दृश्य / आंशिक प्रदर्शित कर सकता है।

अक्सर आपके पास कस्टम ईवेंट होता है जिसका अर्थ है कई प्रकार के कमांड के लिए विफलता, और यह वह घटना है जो आप वेब सर्वर के दृष्टिकोण से सदस्यता लेते हैं।

जिस सिस्टम पर हम काम कर रहे हैं, हम MassTransit + RabbitMQ संदेश बस + ब्रोकर पर आदेशों / घटनाओं के साथ अनुरोध-प्रतिक्रिया कर रहे हैं और हमारे पास इस विशेष डोमेन में एक ईवेंट है (नाम में एक वर्कफ़्लो मॉडलिंग) InvalidStateTransitionError। अधिकांश आदेश जो राज्य ग्राफ में बढ़त के साथ जाने की कोशिश करते हैं, इस घटना के कारण हो सकते हैं। हमारे मामले में, हम अंततः लगातार प्रतिमान के बाद जीयूआई को मॉडलिंग कर रहे हैं, और इसलिए हम उपयोगकर्ता को एक 'कमांड स्वीकार किए गए' पृष्ठ पर भेजते हैं और उसके बाद इवेंट सब्सक्रिप्शन के माध्यम से वेब सर्वर के विचारों को निष्क्रिय रूप से अपडेट करते हैं। यह उल्लेख किया जाना चाहिए कि हम समग्र जड़ों में भी घटना-सोर्सिंग कर रहे हैं (और साथ ही साथ साग के लिए भी करेंगे)।

तो आप देखते हैं, आप जिस सत्यापन की बात कर रहे हैं, वह वास्तव में अनुप्रयोग-प्रकार के सत्यापन हैं, वास्तविक डोमेन तर्क नहीं। यदि आपका डोमेन सरल है लेकिन आप DDD कर रहे हैं तो एक साधारण डोमेन मॉडल रखने में कोई समस्या नहीं है। जैसा कि आप अपने डोमेन को जारी रखते हैं, हालाँकि, आपको पता चलेगा कि डोमेन उतना सरल नहीं हो सकता जितना कि यह पहली बार निकला था। कई मामलों में कुल रूट / इकाई केवल एक कमांड के कारण होने वाले एक विधि आह्वान को स्वीकार कर सकती है और अपने राज्य में से कुछ को बिना किसी सत्यापन के भी बदल सकती है - खासकर यदि आप अपनी आज्ञाओं पर भरोसा करते हैं जैसे आप वेब सर्वर में उन्हें मान्य करते हैं तो आप क्या करेंगे आप नियंत्रित करते हैं।

मैं नार्वे डेवलपर कॉन्फ्रेंस 2011 से DDD पर दो प्रस्तुतियों और presentationredev 2010 में ग्रेग की प्रस्तुति को देखने की सिफारिश कर सकता हूं ।

चीयर्स, हेंके


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

जिस मान्यता का आप वर्णन कर रहे हैं, वह मुझे 2-चरण सत्यापन प्रोटोकॉल के साथ मॉडलिंग करने के लिए नहीं लगता है - यकीन है, इकाई पर विधि मंगलाचरण के मापदंडों को मान्य करें जैसे आप एक इकाई परीक्षण में परीक्षण करेंगे, लेकिन इसके अलावा; एप्लिकेशन परत / GUI उन नियमों को आसानी से मान्य कर सकता है, जिन्हें आप डोमेन पर कमांड भेजे बिना बता रहे हैं। इमो। जब तक क्लाइंट दुर्भावनापूर्ण नहीं है तब तक कमांड को काम करना चाहिए। यदि क्लाइंट दुर्भावनापूर्ण है, तो कमांड विफल हो जाता है और आपके रीड मॉडल को कभी भी एक प्रासंगिक घटना नहीं मिलती है और आप त्रुटि कतार में समस्याग्रस्त कमांड का निरीक्षण कर सकते हैं।
हेनरिक

UI (ASP.NET MVC) में मैं सभी सत्यापन करने के लिए सत्यापन विशेषताओं का उपयोग कर रहा हूं। इसलिए यदि यह सत्यापन सफल हो जाता है, तो मुझे फिर से डोमेन पर फिर से सत्यापन करने की आवश्यकता नहीं है, लेकिन सिर्फ कमांड निष्पादित करें?
एल-फोर

1
हां, आप कमांड निष्पादित करते हैं लेकिन यह सुनिश्चित कर लें कि एप्लिकेशन लेयर और डोमेन दोनों में कमांड अमान्य नहीं है।
हेनरिक

0

संपादित करें: WaybackMachine लिंक: http://devlicio.us/blogs/billy_mccafferty/archive/2009/02/17/a-response-to-validation-in-a-ddd-world.aspx

कोई पैट उत्तर नहीं है।

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

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

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