आइए इसे समस्या स्थान की एक छोटी समीक्षा के साथ शुरू करें: डीडीडी के मौलिक प्रिंसिपलों में से एक व्यवसाय के नियमों को उन स्थानों पर यथासंभव बंद करना है जहां उन्हें लागू करने की आवश्यकता है। यह एक अत्यंत महत्वपूर्ण अवधारणा है क्योंकि यह आपके सिस्टम को अधिक "सामंजस्यपूर्ण" बनाता है। मूविंग रूल्स "ऊपर की ओर" आमतौर पर एनीमिक मॉडल का संकेत है; जहाँ ऑब्जेक्ट्स डेटा के केवल बैग होते हैं और नियमों को लागू करने के लिए उस डेटा के साथ इंजेक्ट किया जाता है।
एनीमिक मॉडल डेवलपर्स के लिए बहुत कुछ समझ सकता है जो केवल डीडीडी के साथ शुरू हो रहा है। आप एक User
मॉडल बनाते हैं और EmailMustBeUnqiueRule
जो ईमेल को मान्य करने के लिए आवश्यक जानकारी के साथ इंजेक्ट किया जाता है। सरल। सुरुचिपूर्ण। मुद्दा यह है कि यह "तरह" सोच प्रकृति में मौलिक रूप से प्रक्रियात्मक है। डीडीडी नहीं। क्या हो रहा है समाप्त होता है आप दर्जनों Rules
बड़े करीने से लिपटे और encapsulated के साथ एक मॉड्यूल के साथ छोड़ दिया जाता है, लेकिन वे संदर्भ के लिए पूरी तरह से रहित हैं जहां उन्हें अब नहीं बदला जा सकता है क्योंकि यह स्पष्ट नहीं है कि कब / कहाँ लागू किया जाता है। क्या इसका कोई मतलब है? यह स्व-स्पष्ट हो सकता है कि एक EmailMustBeUnqiueRule
के निर्माण पर लागू किया जाएगा User
, लेकिन क्या होगा UserIsInGoodStandingRule
? धीरे-धीरे लेकिन निश्चित रूप से, निकालने का दानेदारकरणRules
उनके संदर्भ में से आपको एक ऐसी प्रणाली के साथ छोड़ देता है जिसे समझना कठिन है (और इस प्रकार बदला नहीं जा सकता है)। नियमों को केवल तभी लागू किया जाना चाहिए जब वास्तविक क्रंचिंग / निष्पादन इतना वर्बोज़ हो कि आपका मॉडल ढीला फोकस करना शुरू कर दे।
अब आपके विशिष्ट प्रश्न पर: मुद्दा Service
/ CommandHandler
फेंकने के साथ यह Exception
है कि आपके व्यवसाय का तर्क आपके डोमेन से लीक ("ऊपर की ओर") होने लगा है। किसी ईमेल को जानने के लिए आपकी Service
/ CommandHandler
आवश्यकता क्यों विशिष्ट होनी चाहिए? एप्लिकेशन सेवा परत का उपयोग आमतौर पर कार्यान्वयन के बजाय समन्वय के लिए किया जाता है। इसका कारण यह स्पष्ट किया जा सकता है कि यदि हम ChangeEmail
आपके सिस्टम में कोई विधि / कमांड जोड़ते हैं । अब बीओटीएच विधियों / कमांड हैंडलर को आपकी अनूठी जांच को शामिल करना होगा। यह वह जगह है जहां एक डेवलपर को "निकालने" का प्रलोभन दिया जा सकता है EmailMustBeUniqueRule
। जैसा कि ऊपर बताया गया है, हम उस मार्ग पर नहीं जाना चाहते हैं।
कुछ अतिरिक्त ज्ञान crunching हमें एक अधिक DDD उत्तर दे सकते हैं। एक ईमेल की विशिष्टता एक अपरिवर्तनीय User
वस्तु है जिसे वस्तुओं के संग्रह में लागू किया जाना चाहिए । क्या आपके डोमेन में एक अवधारणा है जो " User
वस्तुओं का संग्रह" का प्रतिनिधित्व करती है ? मुझे लगता है कि आप शायद देख सकते हैं कि मैं यहाँ कहाँ जा रहा हूँ।
इस विशेष मामले के लिए (और कई और संग्रह में आक्रमणकारियों को शामिल करना) इस तर्क को लागू करने के लिए सबसे अच्छी जगह है Repository
। यह विशेष रूप से सुविधाजनक है क्योंकि Repository
इस तरह के सत्यापन (डेटा स्टोर) को निष्पादित करने के लिए आवश्यक बुनियादी ढांचे का अतिरिक्त टुकड़ा " आपका " भी जानता है। आपके मामले में, मैं इस जाँच को add
विधि में रखूँगा। यह सही समझ में आता है? वैचारिक रूप से, यह इस पद्धति है जो वास्तव में User
आपके सिस्टम में जोड़ता है। डेटा स्टोर एक कार्यान्वयन विवरण है।