में वास्तविक दुनिया तर्क डालने में परेशानी होने के बावजूद Domain Driven Design
लंबे समय से अध्ययन करने के बावजूद अभी भी कुछ मूलभूत बातें हैं जिन्हें मैं आसानी से समझता हूं।डीडीडी डोमेन परत
ऐसा लगता है कि हर बार जब मैं एक अमीर domain layer
डिजाइन करने की कोशिश, मैं अभी भी Domain Services
या एक मोटी Application Layer
का एक बहुत अलग की जरूरत है, और मैं उन्हें में कोई वास्तविक तर्क के साथ लगभग कमजोर डोमेन संस्थाओं के एक समूह के साथ खत्म हो, "GetTotalAmount" और जैसा से। मुख्य मुद्दा यह है कि संस्थाएं बाहरी सामानों से अवगत नहीं हैं, और संस्थाओं में कुछ भी इंजेक्ट करना बुरा व्यवहार है। ऊपर
1. किसी उपयोगकर्ता के प्रवेश के लिए एक सेवा के लिए:
मुझे कुछ उदाहरण देता हूँ। उपयोगकर्ता डेटाबेस में जारी रहता है, एक फाइल जेनरेट और सहेजी जाती है (उपयोगकर्ता खाते के लिए आवश्यक), और एक पुष्टिकरण ईमेल भेजा जाता है।
पुष्टिकरण ईमेल के साथ उदाहरण पर अन्य धागे में भारी चर्चा की गई है, लेकिन कोई वास्तविक निष्कर्ष नहीं है। कुछ लोग तर्क को application service
में डालने का सुझाव देते हैं जो EmailService
और FileService
infrastructure layer
से इंजेक्शन प्राप्त करता है। लेकिन फिर मेरे पास डोमेन के बाहर व्यापार तर्क होगा, है ना? लेकिन इस मामले में मैं अंदर domain layer
(IEmailService
और IFileService
) infrastructure services
के इंटरफेस है की आवश्यकता होगी जो भी अच्छा नहीं लगता है या तो (domain layer
संदर्भ नहीं दे सकता क्योंकि infrastructure layer
) - अन्य कि infrastructure services
इंजेक्शन हो जाता है एक domain service
बनाने का सुझाव । और अन्य Udi Dahan's Domain Events को लागू करने का सुझाव देते हैं और उसके बाद ईमेल सेवा और फ़ाइल सेवा उन घटनाओं की सदस्यता लेते हैं। लेकिन यह बहुत ढीला कार्यान्वयन की तरह लगता है - और यदि सेवा विफल हो जाती है तो क्या होता है? कृपया मुझे बताएं कि आपको क्या लगता है कि यह सही समाधान है।
2. एक डिजिटल संगीत स्टोर से एक गीत खरीदा जाता है। शॉपिंग कार्ट खाली हो गया है। खरीद जारी है। भुगतान सेवा कहा जाता है। एक ईमेल पुष्टि भेजी जाती है।
ठीक है, यह पहले उदाहरण से संबंधित हो सकता है। यहां सवाल यह है कि इस लेनदेन को व्यवस्थित करने के लिए कौन जिम्मेदार है? बेशक मैं इंजेक्शन सेवाओं के साथ एमवीसी नियंत्रक में सब कुछ डाल सकता है। लेकिन अगर मैं असली डीडीडी चाहता हूं तो सभी व्यावसायिक तर्क डोमेन में होना चाहिए। लेकिन किस इकाई में "खरीद" विधि होनी चाहिए? Song.Purchase()
? Order.Purchase()
? OrderProcessor.Purchase()
(डोमेन सेवा)? ShoppingCartService.Purchase()
(आवेदन सेवा?)
यह एक ऐसा मामला है जहां मुझे लगता है कि डोमेन इकाइयों के अंदर वास्तविक व्यापार तर्क का उपयोग करना बहुत मुश्किल है। यदि संस्थाओं में कुछ भी इंजेक्ट करने के लिए यह अच्छा अभ्यास नहीं है, तो वे अपने स्वयं के (और इसके कुल) राज्य की जांच करने से पहले अन्य सामान कैसे कर सकते हैं?
मुझे आशा है कि ये उदाहरण उन मुद्दों को दिखाने के लिए पर्याप्त स्पष्ट हैं जिनके साथ मैं काम कर रहा हूं।
डीडीडी डोमेन के 'फ़ाइल' और 'ईमेल' इकाइयों का हिस्सा बनाने का सुझाव देता है।इंफ्रास्ट्रक्चर वास्तव में फ़ाइल बनाने और वास्तव में एक ईमेल भेजने के लिए ज़िम्मेदार है जब डोमेन परत में संबंधित इकाइयां दिखाई देती हैं। – Lightman