2009-09-05 11 views
14

मैं DDD सीख रहा हूँ और मैं कर रहा हूँ एक छोटा सा इंफ्रास्ट्रक्चर परत में खो: प्रस्तुति, आवेदन, डोमेन और इन्फ्रास्ट्रक्चर:DDD बुनियादी सेवाओं

मैं समझता हूँ के रूप में, "सभी अच्छे DDD अनुप्रयोगों" 4 परतों होना चाहिए। डेटाबेस को रेपॉजिटरीज़ का उपयोग करके एक्सेस किया जाना चाहिए। रेपोजिटरी इंटरफेस डोमेन परत और भंडार कार्यान्वयन में होना चाहिए - इंफ्रास्ट्रक्चर में (संदर्भ DDD: Where to keep domain Interfaces, the Infrastructure?)।

आवेदन, डोमेन और इंफ्रास्ट्रक्चर परत में सेवाओं/संदर्भ हो सकते हैं (संदर्भ www.lostechies.com/blogs/jimmy_bogard/archive/2008/08/21/services-in-domain-driven-design.aspx), उदाहरण में इंफ्रास्ट्रक्चर परत में ईमेल सेवा जो ईमेल संदेश भेजती है।

लेकिन, इंफ्रास्ट्रक्चर परत के अंदर हमारे पास भंडार कार्यान्वयन है, जिसका उपयोग डेटाबेस तक पहुंचने के लिए किया जाता है। तो, इस मामले में, भंडार डेटाबेस सेवाएं हैं? इंफ्रास्ट्रक्चर सेवा और भंडार के बीच क्या अंतर है?

अग्रिम धन्यवाद!

उत्तर

14

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

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

आप पूरे स्थान पर डीडीडी के साथ शब्दावली संघर्ष में भाग लेते हैं। उदाहरण के लिए, एक डीडीडी रिपोजिटरी मार्टिन फाउलर की पीओईएए पुस्तक में Repository pattern जैसी ही बात नहीं है, हालांकि यह इस तरह के पैटर्न को नियोजित कर सकती है। यह अक्सर कई लोगों के लिए भ्रम का स्रोत है।

यदि आप हमेशा अपने द्वारा किए गए सभी कार्यों के केंद्र में डोमेन मॉडल रखते हैं तो यह डीडीडी के साथ मदद करता है। जब डीडीडी ऐप्स को लेयर करने की बात आती है, तो मैं अक्सर Jeffrey Palermo's Onion Architecture चुनता हूं। इसकी जांच - पड़ताल करें। CodeCampServer डाउनलोड करें, इस आर्किटेक्चर का उपयोग कर एक उदाहरण ऐप। मुझे लगता है कि यह डीडीडी प्रोग्रामिंग के लिए एकदम सही फिट है।

शुभकामनाएं!

7

डीडीडी के बारे में एक दुर्भाग्यपूर्ण बात शब्द 'सेवा' है। यह 'डोमेन सेवा' होना चाहिए। डोमेन को संस्थाओं और मूल्य वस्तुओं के रूप में सोचें, जबकि सेवाएं क्रियाओं, संचालन और गतिविधियों से निपटने का एक तरीका हैं।

रेपॉजिटरीज़ के लिए, वे केवल एक मुखौटा हैं जो आपके डोमेन में संग्रह की तरह व्यवहार करना चाहिए। यदि आप ओआरएम का उपयोग कर रहे हैं या अपना खुद का लेखन कर रहे हैं, तो यही वह है जो आपकी सेवाओं की बजाय दृढ़ता प्राप्त करने के लिए आपके सभी डोमेन ऑब्जेक्ट्स को आगे बढ़ाना चाहिए।

+0

ठीक है, शायद आपने मेरे प्रश्न को गलत समझा, या मैंने जवाब को गलत समझा। इंफ्रास्ट्रक्चर परत के अंदर, यदि हमारे पास मेल एपीआई से संबंधित एक सेवा है, तो हम इसे "ईमेल सेवा" कहते हैं, लेकिन डेटाबेस से डेटा पुनर्प्राप्त करने के लिए कोड को "रिपोजिटरी कार्यान्वयन" कहा जाता है। क्या यह एक ही प्रकार की "आधारभूत सेवा" नहीं है? – Zygimantas

-1

आप इंफ्रास्ट्रक्चर में रिपोजिटरी कार्यान्वयन क्यों लगाएंगे? वे सभी इम्हो में 'इंफ्रास्ट्रक्चर' से संबंधित नहीं हैं। मैं ज्यादातर रिपोजिटरी इंटरफेस को 'डोमेन मॉडल' में डालता हूं, और मैंने उन रिपॉजिटरीज को डोमेन मॉडल के कार्यान्वयन को भी रखा है।

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

तो, अपने भंडारों को 'आधारभूत संरचना' में न रखें, क्योंकि वे वहां नहीं हैं। मेरे लिए, कक्षाएं जो बुनियादी ढांचे में पाई जा सकती हैं, वे कक्षाएं हैं जिनका आप विभिन्न अन्य परियोजनाओं में उपयोग कर सकते हैं, मेरा मतलब क्या है? कक्षाएं जो आपके डोमेन मॉडल या एप्लिकेशन से कड़ाई से संबंधित नहीं हैं, वे इंफ्रास्ट्रक्चर में हैं। और एक भंडार कार्यान्वयन एक विशिष्ट आवेदन के साथ काफी कसकर है। :)

+1

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

+0

वास्तव में, आवेदन में भंडार कार्यान्वयन नहीं होना चाहिए। यह डोमेन मॉडल में होना चाहिए। हालांकि, एप्लिकेशन-लेयर को एक भंडार द्वारा उपयोग किए जाने वाले लेन-देन-दायरे को नियंत्रित करना चाहिए। –

+0

मुझे लगता है कि एक पारंपरिक भंडार डोमेन मॉडल के बाहर लागू किया जाना चाहिए यदि इसमें डेटा पहुंच करने के लिए वास्तविक आधारभूत संरचना है। लेकिन जिमी निल्सन की एनडॉर्स्पेस अवधारणा के साथ मुझे लगता है कि भंडारों के बाद गैर-आधारभूत संरचना कार्यान्वयन हो सकती है जो डोमेन परत में वापस ले जाया जाता है जहां यह अधिक समझ में आता है। – jpierson

5

शायद यह एक संभावित परियोजना संरचना को देखने में मदद करेगा।

संभावित विधानसभा या पैकेज संरचना:

Project.Domain
Project.Infrastructure.Data
Project.Infrastructure.Components
Project.Infrastructure.Services

संभावित नाम स्थान या फ़ोल्डर संरचना:

प्रोजेक्ट। डोमेन
-n- मॉड्यूल
---- n- खाता
------- एफ Account.xx
------- एफ AccountRepository.xx
----- --f- Contact.xx
---- n- विपणन
------- एफ RegionRepository.xx
-n- साझा
-n- सेवाएं

Project.Infrastructure डाटा (OR-Mappers)
-n- टेबल्स
-n- दृश्य
-n- प्रक्रियाएं
-n- कार्य

Project.Infrastructure.Components (सामान्य)
-n- मेल
-n- क्रिप्टोग्राफी
-n- यूआई

Project.Infrastructure.Services (स्पेशल ऑपरेशंस)
-f- DoingSomethingService1.xx
-f- DoingSo methingService2.xx
-f- DoingSomethingService3.xx

डोमेन संस्थाओं और मूल्य प्रकार डोमेन सेवा का उपयोग नहीं करते। एप्लिकेशन लेयर डोमेन की सेवाओं का उपयोग करता है। डोमेन रिपोजिटरी ऑब्जेक्ट्स डोमेन ऑब्जेक्ट्स को वापस करने के लिए इंफ्रास्ट्रक्चर। डेटा ऑब्जेक्ट्स का उपयोग करते हैं।

+2

डीडीडी का बिंदु एक निश्चित परियोजना संरचना नहीं है, बल्कि आपकी संस्थाओं पर व्यवहार करना है। जब आप कहते हैं "अपनी ओआरएम ऑब्जेक्ट्स की प्रतियां बनाएं" ऐसा लगता है जैसे आप एनीमिक डोमेन का उपयोग कर रहे हैं, जो वास्तव में डीडीडी नहीं है। व्यवहार (डोमेन स्थिति उत्परिवर्तन) डोमेन ऑब्जेक्ट्स के अंदर होना चाहिए, सेवाओं में नहीं। – Ryan

+0

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

+0

मुझे लगता है कि आप गुणों का मतलब है, गुण नहीं। मुझे स्पष्ट करने के लिए आलोचना करने का मतलब नहीं है। मैं विचार के स्कूल में हूं कि डोमेन ऑब्जेक्ट पर गुण एंटी-पैटर्न हैं। हाल ही में मैं एक अर्ध-cqrs मार्ग की ओर जा रहा हूं: मेरे डोमेन पर केवल गुणों को पढ़ें और राज्य को बदलने के तरीकों को पढ़ें। मेरे विचार denormalized डीबी विचारों से 50% पढ़ने और डोमेन मॉडल से 50% प्रक्षेपण कर रहे हैं। जिस दृष्टिकोण को मैं चुनता हूं वह डेटा की जटिलता पर निर्भर करता है। – Ryan