वास्तव में CQRS कमांड को एक डोमेन ऑब्जेक्ट के लिए कैसे मान्य और रूपांतरित किया जाना चाहिए?


22

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

लेकिन दुर्भाग्य से शुरू से ही मैं इस समस्या से जूझ रहा था, जहाँ मुझे इस प्रकार की वास्तुकला में व्यावसायिक तर्क रखने चाहिए।

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

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

तो असली सवाल यह है: वास्तव में तर्क कहाँ है?

मुझे पता चला है कि मैं इस संघर्ष का सामना सबसे अधिक बार करता हूं जब एक काफी जटिल समुच्चय का निर्माण करने की कोशिश की जाती है जो इसके मूल्यों के संयोजन के बारे में कुछ नियम निर्धारित करता है। इसके अलावा, जब डोमेन डोमेन ऑब्जेक्ट्स को मैं फेल-फास्ट प्रतिमान का पालन करना पसंद करता हूं , तो यह जानते हुए कि जब कोई वस्तु एक विधि तक पहुंचती है तो यह एक वैध स्थिति में है।

मान लीजिए कि एक समुच्चय Carदो घटकों का उपयोग करता है:

  • Transmission,
  • Engine

दोनों Transmissionऔर Engineमूल्य वस्तुओं सुपर प्रकार के रूप में प्रतिनिधित्व कर रहे हैं और अनुसार उप प्रकार है, Automaticऔर Manualप्रसारण, या PetrolऔरElectric क्रमशः इंजन के अनुसार होता है।

इस डोमेन में, अपने आप ही सफलतापूर्वक बनाया गया Transmission, यह हो Automaticया Manual, या तो एक प्रकार का Engineहै, पूरी तरह से ठीक है। लेकिन Carसमुच्चय कुछ नए नियमों को लागू करता है, केवल तब लागू होता है जब वस्तुओं Transmissionऔर Engineसमान संदर्भ में उपयोग किया जाता है। अर्थात्:

  • जब एक कार Electricइंजन का उपयोग करती है तो केवल अनुमत ट्रांसमिशन प्रकार होता है Automatic
  • जब कोई कार Petrolइंजन का उपयोग करती है तो उसका प्रकार भी हो सकता है Transmission

मैं कमांड बनाने के स्तर पर इस घटक संयोजन उल्लंघन को पकड़ सकता हूं, लेकिन जैसा कि मैंने पहले कहा है, जो मैं समझता हूं कि ऐसा नहीं किया जाना चाहिए क्योंकि कमांड में फिर व्यावसायिक तर्क शामिल होंगे जो कि डोमेन परत तक सीमित होना चाहिए।

विकल्पों में से एक यह है कि इस व्यापार तर्क सत्यापन को वैधता कमांड करने के लिए स्थानांतरित किया जाए, लेकिन यह सही भी नहीं लगता है। ऐसा लगता है कि मैं कमांड को डिकॉन्स्ट्रक्ट कर रहा हूं, गेटर्स का उपयोग करके प्राप्त किए गए गुणों की जांच करना और सत्यापनकर्ता के भीतर उनकी तुलना करना और परिणामों का निरीक्षण करना। यह मेरे लिए Demeter कानून के उल्लंघन की तरह चिल्लाता है।

उल्लिखित सत्यापन विकल्प को छोड़ना क्योंकि यह व्यवहार्य नहीं लगता है, ऐसा लगता है जैसे किसी को कमांड का उपयोग करना चाहिए और इससे कुल का निर्माण करना चाहिए। लेकिन यह तर्क कहां मौजूद होना चाहिए? क्या यह एक ठोस कमांड को संभालने के लिए जिम्मेदार कमांड हैंडलर के भीतर होना चाहिए? या यह शायद कमांड वैलिडेटर के भीतर होना चाहिए (मुझे यह दृष्टिकोण पसंद नहीं है)?

मैं वर्तमान में एक कमांड का उपयोग कर रहा हूं और जिम्मेदार कमांड हैंडलर के भीतर इससे एक एग्रीगेट बना रहा हूं। लेकिन जब मैं ऐसा करता हूं, तो क्या मेरे पास एक कमांड वैलिडेटर होना चाहिए, इसमें कुछ भी शामिल नहीं होगा, क्योंकि CreateCarकमांड मौजूद होना चाहिए और फिर इसमें ऐसे घटक शामिल होंगे जो मुझे पता है कि अलग-अलग मामलों में मान्य हैं, लेकिन कुल अलग-अलग कह सकते हैं।


आइए, अलग-अलग सत्यापन प्रक्रियाओं को मिलाकर एक अलग परिदृश्य की कल्पना करें - एक का उपयोग करके एक नया उपयोगकर्ता बनाएं CreateUser कमांड बनाता है।

आदेश एक में शामिल है Idएक उपयोगकर्ता बना लिया होगा, जो किया गया है और उनके की Email

सिस्टम उपयोगकर्ता के ईमेल पते के लिए निम्नलिखित नियम बताता है:

  • अनोखा होना चाहिए,
  • खाली नहीं होना चाहिए,
  • अधिकतम 100 वर्ण (db कॉलम की अधिकतम लंबाई) होनी चाहिए।

इस मामले में, भले ही एक अनूठा ईमेल एक व्यावसायिक नियम है, लेकिन इसे समग्र रूप से जांचना बहुत कम समझ में आता है, क्योंकि मुझे सिस्टम में वर्तमान ईमेल के पूरे सेट को एक मेमोरी में लोड करना होगा और कमांड में ईमेल की जांच करनी होगी। कुल के खिलाफ ( Eekek! कुछ, कुछ, प्रदर्शन।)। उसके कारण, मैं इस चेक को कमांड वैलिडेटर के पास ले जाऊंगा, जो UserRepositoryएक निर्भरता के रूप में लेगा और यह जांचने के लिए रिपॉजिटरी का उपयोग करेगा कि कमांड में मौजूद ईमेल वाला उपयोगकर्ता पहले से मौजूद है या नहीं।

जब यह इस पर आता है तो यह अचानक कमांड वैलिडेटर में अन्य दो ईमेल नियमों को डालने के लिए समझ में आता है। लेकिन मुझे लगता है कि नियमों को वास्तव में एक Userसमुच्चय के भीतर मौजूद होना चाहिए और यह कि कमांड सत्यापनकर्ता को केवल विशिष्टता के बारे में जांच करनी चाहिए और यदि सत्यापन सफल होता है तो मुझे Userएकत्रीकरण बनाने CreateUserCommandHandlerऔर इसे बचाने के लिए एक रिपॉजिटरी को पास करने के लिए आगे बढ़ना चाहिए ।

मुझे ऐसा लगता है क्योंकि रिपॉजिटरी की सेव विधि एक एग्रीगेट को स्वीकार करने की संभावना है जो यह सुनिश्चित करता है कि एक बार एग्रीगेट पास हो जाने के बाद सभी इन्वर्टर पूरे हो जाएं। जब तर्क (जैसे गैर-शून्यता) केवल कमांड सत्यापन के भीतर मौजूद होता है, तो कोई अन्य प्रोग्रामर इस सत्यापन को पूरी तरह से छोड़ सकता है और UserRepositoryकिसी Userऑब्जेक्ट के साथ सेव विधि को सीधे कॉल कर सकता है, जिससे घातक डेटाबेस त्रुटि हो सकती है, क्योंकि ईमेल में हो सकता है बहुत लंबा हो गया।

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


1 एक PHP डेवलपर के रूप में कार्य करना Restful सिस्टम बनाने के लिए जिम्मेदार CQRS की मेरी व्याख्या मानक async-command-processing दृष्टिकोण से थोड़ा विचलित करती है , जैसे कि कभी-कभी आदेशों की आवश्यकता के कारण आदेशों को सिंक्रोनाइज़ करने के कारण परिणाम वापस करना।


मुझे लगता है कि कुछ उदाहरण कोड की जरूरत है। आपके कमांड ऑब्जेक्ट क्या दिखते हैं और आप उन्हें कहाँ बनाते हैं?
इवान

@ इवान मैं कोड नमूने आज या कल में जोड़ूंगा। कुछ ही मिनटों में एक यात्रा के लिए छोड़कर।
एंडी

एक PHP प्रोग्रामर होने के नाते मैं अपने CQRS + ES कार्यान्वयन पर एक नज़र डालने का सुझाव देता हूं: github.com/xprt64/cqrs-es
कॉन्स्टैंटिन गैलबेनू

@ConstantinGALBENU क्या हमें ग्रेग यंग की CQRS की व्याख्या को सही मानना ​​चाहिए (जो कि हमें शायद चाहिए) तो CQRS की आपकी समझ गलत है - या कम से कम आपका PHP कार्यान्वयन है। कमांड को सीधे समुच्चय द्वारा नियंत्रित नहीं किया जाना है। कमान संचालकों द्वारा संभाला जाना चाहिए जो समुच्चय में परिवर्तन का उत्पादन कर सकते हैं जो तब राज्य प्रतिकृति के लिए उपयोग की जाने वाली घटनाओं का उत्पादन करते हैं।
एंडी

मुझे नहीं लगता कि हमारी व्याख्याएं अलग हैं। आपको सिर्फ DDD (Aggregates के सामरिक स्तर पर) में अधिक खुदाई करनी होगी या अपनी आँखें खोलनी होंगी। CQRS को लागू करने की कम से कम दो शैलियाँ हैं। मैं उनमें से एक का उपयोग करता हूं। मेरा कार्यान्वयन अभिनेता मॉडल से अधिक मिलता है और एप्लिकेशन परत को बहुत पतला बनाता है, जो हमेशा एक अच्छी बात है। मैंने देखा कि उन ऐप सेवाओं के अंदर बहुत सारे कोड डुप्लिकेट हैं और उन्हें एक के साथ बदलने का फैसला किया है CommandDispatcher
कांस्टेंटिन गैलबेनू

जवाबों:


22

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

तो असली सवाल यह है: वास्तव में तर्क कहाँ है?

कई प्रकार के (सत्यापन) तर्क हैं। सामान्य विचार तर्क को जल्द से जल्द निष्पादित करना है - यदि आप चाहते हैं तो तेजी से विफल। तो, स्थितियां इस प्रकार हैं:

  • कमांड ऑब्जेक्ट की संरचना ही; कमांड के निर्माता के पास कुछ आवश्यक फ़ील्ड हैं जो कमांड के निर्माण के लिए मौजूद होना चाहिए; यह पहला और सबसे तेज़ सत्यापन है; यह स्पष्ट रूप से कमांड में निहित है।
  • निम्न स्तर क्षेत्र सत्यापन, कुछ क्षेत्रों के गैर-खालीपन (जैसे उपयोगकर्ता नाम) या प्रारूप (एक वैध ईमेल पता) की तरह। इस प्रकार का सत्यापन कमांड के अंदर, कंस्ट्रक्टर में ही होना चाहिए। एक isValidविधि होने की एक और शैली है, लेकिन यह मेरे लिए व्यर्थ लगता है क्योंकि किसी को इस पद्धति को कॉल करने के लिए याद करना होगा जब वास्तव में सफल कमांड इंस्टेंटेशन को पर्याप्त होना चाहिए।
  • अलग command validators, वे कक्षाएं जिनके पास कमांड को मान्य करने की जिम्मेदारी है। जब मुझे कई समुच्चय या बाहरी स्रोतों से जानकारी की आवश्यकता होती है तो मैं इस तरह के सत्यापन का उपयोग करता हूं। आप इसका उपयोग किसी उपयोगकर्ता नाम की विशिष्टता की जांच करने के लिए कर सकते हैं। Command validatorsकिसी भी निर्भरता को इंजेक्ट किया जा सकता है, जैसे रिपॉजिटरी। ध्यान रखें कि यह मान्यता अंततः एग्रीगेट के साथ सुसंगत है (यानी जब यूजर क्रिएट हो जाता है, तो उसी यूजरनेम वाला दूसरा यूजर इस बीच बनाया जा सकता है)! इसके अलावा, यहां तर्क रखने की कोशिश न करें जो कुल के अंदर निवास करें! कमांड सत्यापनकर्ता सगाओं / प्रक्रिया प्रबंधकों से भिन्न होते हैं जो घटनाओं के आधार पर कमांड उत्पन्न करते हैं।
  • आदेशों को प्राप्त करने और संसाधित करने वाली कुल विधियाँ। यह अंतिम (एक प्रकार का) सत्यापन होता है। कुल डेटा कमांड से डेटा को निकालता है और कुछ मुख्य व्यावसायिक तर्क का उपयोग करके इसे स्वीकार करता है (यह राज्य में परिवर्तन करता है) या इसे अस्वीकार करता है। यह तर्क मजबूत सुसंगत तरीके से जांचा जाता है। यह रक्षा की अंतिम पंक्ति है। आपके उदाहरण में, नियमWhen a car uses Electric engine the only allowed transmission type is Automatic को यहां चाहिए।

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

उपरोक्त तकनीकों का उपयोग करके कोई भी अमान्य आदेश नहीं बना सकता है या समुच्चय के अंदर तर्क को बायपास नहीं कर सकता है । कमांड सत्यापनकर्ता स्वचालित रूप से लोड हो जाते हैं + CommandDispatcherइसलिए किसी को भी सीधे कमांड नहीं भेज सकते हैं। एक कमांड को पास करने वाले कुल पर एक विधि कह सकता है लेकिन परिवर्तनों को जारी नहीं रख सकता है इसलिए ऐसा करना व्यर्थ / हानिरहित होगा।

RESTful सिस्टम बनाने के लिए ज़िम्मेदार PHP डेवलपर के रूप में कार्य करना CQRS की मेरी व्याख्या मानक async-कमांड-प्रोसेसिंग दृष्टिकोण से थोड़ा विचलित करती है, जैसे कि कभी-कभी प्रोसेसिंग कमांड्स की आवश्यकता के कारण कमांड से परिणाम को सिंक्रनाइज़ करने की आवश्यकता होती है।

मैं एक PHP प्रोग्रामर भी हूं और मैं अपने कमांड हैंडलर (फॉर्म में कुल तरीके handleSomeCommand) से कुछ भी वापस नहीं करता हूं । मैं, हालांकि, अक्सर, क्लाइंट / ब्राउज़र को जानकारी लौटाता हूं, HTTP responseउदाहरण के लिए नए बनाए गए एग्रीगेट रूट की आईडी या रीड-मॉडल से कुछ लेकिन मैं कभी नहीं लौटता (वास्तव में कभी नहीं अपने एग्रीगेट कमांड के तरीकों से कुछ भी )। साधारण तथ्य यह है कि कमांड को स्वीकार किया गया था (और संसाधित किया गया था - हम तुल्यकालिक PHP प्रसंस्करण के बारे में बात कर रहे हैं, ठीक है!) पर्याप्त है।

हम ब्राउज़र को कुछ वापस करते हैं (और अभी भी पुस्तक द्वारा CQRS कर रहे हैं) क्योंकि CQRS एक उच्च स्तरीय वास्तुकला नहीं है

कमांड सत्यापनकर्ता कैसे काम करते हैं, इसका एक उदाहरण:

कमांड के मार्ग के माध्यम से कमांड के रास्ते को एग्रीगेट पर ले जाएं


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

@ किंग-साइड-स्लाइड नहीं अगर आपके पास एक EmailAddressवैल्यू ऑब्जेक्ट है जो खुद को मान्य करता है।
कांस्टेंटिन गैलबेनु

यह पूरी तरह से सही है। EmailAddressनकल को कम करने के लिए कोई भी एक एनकाउंटर कर सकता है । इससे भी महत्वपूर्ण बात यह है कि ऐसा करने में आप अपने कमांड से और अपने डोमेन से तर्क को स्थानांतरित कर रहे हैं। यह ध्यान देने योग्य है कि इसे बहुत दूर ले जाया जा सकता है। अक्सर ज्ञान के समान टुकड़े (मूल्य वस्तु) का उपयोग करने के आधार पर विभिन्न सत्यापन आवश्यकताएं हो सकती हैं। EmailAddressएक सुविधाजनक उदाहरण है क्योंकि इस मूल्य के पूरे गर्भाधान के लिए वैश्विक सत्यापन आवश्यकताएं हैं।
राजा-पक्ष-स्लाइड

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

1
@ किंग-साइड-स्लाइड एक ठोस उदाहरण है UserCanPlaceOrdersOnlyIfHeIsNotLockedValidator। आप देख सकते हैं कि यह एक अलग डोमेन है जो ऑर्डर्स का है इसलिए इसे आर्डरएग्रीगेट द्वारा ही मान्य नहीं किया जा सकता है।
कांस्टेंटिन गैलबेनू

6

DDD का एक मूल आधार यह है कि डोमेन मॉडल स्वयं को मान्य करते हैं। यह एक महत्वपूर्ण अवधारणा है क्योंकि यह आपके डोमेन को ऊपर उठाता है क्योंकि यह सुनिश्चित करने के लिए जिम्मेदार पार्टी है कि आपके व्यवसाय नियम लागू किए गए हैं। यह आपके डोमेन मॉडल को विकास के लिए फोकस के रूप में भी रखता है।

एक CQRS प्रणाली (जैसा कि आप सही ढंग से इंगित करते हैं) एक सामान्य जेनेरिक उप-डोमेन का प्रतिनिधित्व करने वाला एक कार्यान्वयन विवरण है, जो इसका एक सामंजस्यपूर्ण तंत्र है। आपके मॉडल को किसी भी तरह से आपके व्यावसायिक नियमों के अनुसार व्यवहार करने के लिए CQRS बुनियादी ढांचे के किसी भी टुकड़े पर निर्भर नहीं होना चाहिए । DDD का लक्ष्य व्यवहार को मॉडल बनाना है एक प्रणाली है ताकि परिणाम आपके मुख्य व्यवसाय डोमेन की कार्यात्मक आवश्यकताओं का एक उपयोगी अमूर्त है। इस व्यवहार के किसी एक टुकड़े को अपने मॉडल से बाहर ले जाना, हालाँकि, लुभाना, आपके मॉडल की अखंडता और सामंजस्य को कम कर रहा है (और इसे कम उपयोगी बनाता है)।

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

  • ईमेल खाली नहीं हो सकता
  • ईमेल 100 वर्णों से अधिक लंबा नहीं हो सकता है
  • ईमेल अद्वितीय होना चाहिए

तो अब जब हम सुनिश्चित कर सकते हैं कि हमारे तर्क हमारे डोमेन में होना चाहिए, तो "जहाँ" के मुद्दे से निपटें। पहले दो नियमों को आसानी से हमारे Userसमुच्चय पर लागू किया जा सकता है , लेकिन यह अंतिम नियम थोड़ा अधिक बारीक है; एक जिसे कुछ गहन ज्ञान प्राप्त करने के लिए कुछ और ज्ञान की आवश्यकता होती है। सतह पर, ऐसा लग सकता है कि यह नियम किसी पर लागू होता है User, लेकिन यह वास्तव में ऐसा नहीं करता है। एक ईमेल की "विशिष्टता" Users(कुछ दायरे के अनुसार) के संग्रह पर लागू होती है ।

आह हा! इसे ध्यान में रखते हुए, यह स्पष्ट रूप से स्पष्ट हो जाता है कि आपका UserRepository(आपकी मेमोरी का संग्रह Users) इस आक्रामक को लागू करने के लिए एक बेहतर उम्मीदवार हो सकता है। चेक को शामिल करने (जहां आप UserEmailAlreadyExistsअपवाद फेंक सकते हैं) में "सेव" विधि संभवतः सबसे उचित स्थान है । वैकल्पिक रूप से, एक डोमेन UserServiceको नया बनाने के लिए जिम्मेदार बनाया जा सकता हैUsers और उनकी विशेषताओं को अपडेट करने के ।

फेल फास्ट एक अच्छा तरीका है, लेकिन यह केवल तब किया जा सकता है जब यह बाकी मॉडल के साथ कहां और कब फिट बैठता है। जब आप (डेवलपर) को पता चलता है कि प्रक्रिया में कहीं अधिक गहराई से कॉल विफल हो जाएगी, तो असफलताओं को पकड़ने के प्रयास में आगे की प्रक्रिया करने से पहले एक एप्लिकेशन सेवा पद्धति (या कमांड) पर मापदंडों की जांच करना बेहद लुभावना हो सकता है। लेकिन ऐसा करने में, आपके पास एक तरह से ज्ञान का दोहराव (और लीक) होगा, जिसकी संभावना व्यावसायिक नियमों में बदलाव होने पर कोड को एक से अधिक अद्यतन करने की आवश्यकता होगी।


2
मैं इससे सहमत हु। अब तक (CQRS के बिना) मेरा पढ़ना मुझे बताता है कि मान्यता हमेशा हमलावरों की रक्षा के लिए डोमेन मॉडल में जानी चाहिए। अब मैं CQRS पढ़ रहा हूं यह मुझे कमांड ऑब्जेक्ट्स में सत्यापन लगाने के लिए कह रहा है। यह काउंटर सहज लगता है। क्या आप GitHub पर किसी भी उदाहरण के बारे में जानते हैं जहां कमांड के बजाय डोमेन मॉडल में सत्यापन रखा गया है? +1।
w0051977
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.