जैसा कि मैं इसे समझता हूं, एक मुख्य बिंदु इन्फ्रास्ट्रक्चर (डीबी, फाइल सिस्टम, आदि) से डोमेन लॉजिक (बिजनेस लॉजिक) को विभाजित करना है।
यह गलतफहमी की नींव है: डीडीडी का उद्देश्य हार्ड लाइन के साथ चीजों को अलग नहीं करना है जैसे "यह एसक्यूएल सर्वर में है, इसलिए बीएल नहीं होना चाहिए", डीडीडी का उद्देश्य डोमेन को अलग करना और बीच में अवरोध पैदा करना है उन्हें जो एक डोमेन के इंटर्नल को दूसरे डोमेन के इंटर्नल से पूरी तरह से अलग करने और उनके बीच साझा एक्सटर्नल को परिभाषित करने की अनुमति देता है।
बीएल / डीएल बाधा के रूप में "एसक्यूएल में होने" के बारे में न सोचें - यह ऐसा नहीं है। इसके बजाय, अवरोध के रूप में "यह आंतरिक डोमेन का अंत है" के बारे में सोचें।
प्रत्येक डोमेन में बाहरी-सामना करने वाला एपीआई होना चाहिए जो इसे अन्य सभी डोमेन के साथ काम करने की अनुमति देता है : डेटा स्टोरेज लेयर के मामले में , इसमें डेटा-ऑब्जेक्ट्स को स्टोर करने के लिए रीड / राइट (CRUD) एक्शन होना चाहिए। इसका मतलब यह है कि एसक्यूएल ही वास्तव में बाधा नहीं है, VIEW
और PROCEDURE
घटक हैं। आपको तालिका से कभी भी सीधे नहीं पढ़ना चाहिए: यह कार्यान्वयन विवरण है डीडीडी हमें बताता है कि, बाहरी उपभोक्ता के रूप में, हमें चिंता नहीं करनी चाहिए।
अपने उदाहरण पर विचार करें:
मैं जो सोच रहा हूं, क्या होता है जब मेरे पास सामग्री संसाधन गणना क्वेरी जैसे बहुत जटिल प्रश्न होते हैं? उस प्रकार की क्वेरी में आप भारी सेट संचालन के साथ काम करते हैं, जिस तरह की SQL के लिए डिज़ाइन किया गया था।
यह वास्तव में SQL में क्या होना चाहिए, और यह DDD का उल्लंघन नहीं है। यह वही है जिसके लिए हमने डीडीडी बनाया है । SQL में उस गणना के साथ, जो BL / DL का हिस्सा बन जाता है । आप में उपयोग करना होगा क्या एक अलग दृश्य / संग्रहीत प्रक्रिया / क्या-है-आप, और व्यापार तर्क डेटा परत से अलग रखने के लिए, के रूप में है कि अपने बाहरी API है। वास्तव में, आपकी डेटा-लेयर एक और DDD डोमेन लेयर होनी चाहिए, जहाँ आपके डेटा-लेयर के पास अन्य डोमेन लेयर्स के साथ काम करने के लिए खुद का एबस्ट्रैक्शन है।
बुनियादी ढांचे में इन गणनाओं को करने से भी नहीं हो सकता है, क्योंकि DDD पैटर्न डोमेन लेयर को बदले बिना बुनियादी ढांचे में बदलाव की अनुमति देता है और यह जानते हुए भी कि MongoDB में उसी SQL सर्वर की समान क्षमता नहीं है, ऐसा नहीं हो सकता है।
यह एक और गलतफहमी है: यह कहता है कि कार्यान्वयन विवरण आंतरिक रूप से अन्य डोमेन परतों को बदलने के बिना बदल सकते हैं । यह नहीं कहता कि आप बस एक पूरे बुनियादी ढाँचे को बदल सकते हैं ।
फिर, ध्यान रखें, DDD अच्छी तरह से परिभाषित बाहरी एपीआई के साथ आंतरिक छिपाने के बारे में है। जहां उन एपीआई का बैठना बिल्कुल अलग सवाल है, और डीडीडी इसे परिभाषित नहीं करता है। यह केवल यह परिभाषित करता है कि ये API मौजूद है, और इसे कभी नहीं बदलना चाहिए ।
DDD ने आपको MongoDB के साथ MSSQL की जगह एड-हॉक की अनुमति देने के लिए सेटअप नहीं किया है - वे दो बिल्कुल अलग बुनियादी ढांचे के घटक हैं।
इसके बजाय, आइए DDD को परिभाषित करने के लिए एक सादृश्य का उपयोग करें: गैस बनाम इलेक्ट्रिक कार। दोनों वाहनों में प्रणोदन बनाने के लिए दो पूरी तरह से अलग-अलग विधियां हैं, लेकिन उनके पास एक ही एपीआई है: ऑन / ऑफ, एक थ्रॉटल / ब्रेक, और वाहन को चलाने के लिए पहियों। डीडीडी का कहना है कि हमें अपनी कार में इंजन (गैस या इलेक्ट्रिक) को बदलने में सक्षम होना चाहिए। यह नहीं कहता कि हम कार को मोटरसाइकिल से बदल सकते हैं, और यह प्रभावी रूप से MSSQL → MongoDB है।