DDD में, एक डोमेन सेवा अनिवार्य रूप से सिर्फ एक मुखौटा और / या मध्यस्थ पैटर्न है?


13

Domain Driven Design में, Domain Layer में कई (पारंपरिक) सेवाएँ हो सकती हैं। उदाहरण के लिए, उपयोगकर्ता डोमेन के लिए, हमारे पास हो सकता है:

  • एक UserFactory, जो अलग-अलग तरीकों से उपयोगकर्ता ऑब्जेक्ट बनाता है
  • एक UserRepository, जो Infrastructure Layer में Persistence Services के साथ बातचीत के लिए जिम्मेदार है

क्या डोमेन लेयर में एक उपयोगकर्ता सेवा केवल एक मध्यस्थ और / या उन दो सेवाओं और इन्फ्रास्ट्रक्चर लेयर के लिए फीका है, या क्या इसके लिए अधिक है?



मैंने स्तर गोरोदिंस्की की पोस्ट को बहुत अच्छी तरह से पढ़ा है, हालांकि उस दूसरी कड़ी को कभी नहीं देखा। महान पढ़ा, निश्चित रूप से कुछ महत्वपूर्ण बिंदुओं को छूता है!
e_i_pi

जवाबों:


11

Domain services सबसे अच्छा वर्णन किया गया है कि वे क्या नहीं हैं:

  • वे न तो हैं और न EntitiesहीAggregate roots
  • वो नहीं हैं Value objects
  • ऐसे डोमेन ज्ञान को ले जाएं जो स्वाभाविक रूप से केवल एक Entity या एक फिट नहीं है Value object

एक का एक उदाहरण Domain serviceहै Saga/Process manager: यह एक लंबी चलने की प्रक्रिया का समन्वय करता है जिसमें कई Aggregate roots, विभिन्न से संभव है Bounded contexts

यह कहा जा रहा है, क्या है Domain serviceऔर इसे कैसे लागू किया जाता है, यह दो रूढ़िवादी बातें हैं।

क्या डोमेन लेयर में एक उपयोगकर्ता सेवा केवल एक मध्यस्थ और / या उन दो सेवाओं और इन्फ्रास्ट्रक्चर लेयर के लिए फीका है, या क्या इसके लिए अधिक है?

कुछ डोमेन सेवाएं जैसे कि UserRepository(इंटरफ़ेस में Domain layerऔर एक ठोस कार्यान्वयन से बना Infrastructure layer) डिज़ाइन पैटर्न का उपयोग करके लागू किया जा सकता है Facade। अन्य डोमेन सेवाएँ नहीं हैं।

उन्हें लागू करने के तरीके के बारे में कोई कठोर नियम नहीं है, महत्वपूर्ण नियम के अलावा जो Domain layerअन्य परतों (और SOLID ) पर निर्भर नहीं होना चाहिए ।


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

1
@e_i_pi व्यावसायिक नियम केवल एग्रीगेट्स और उनके नेस्टेड संस्थाओं द्वारा संरक्षित हैं। डोमेन सेवाएँ इसमें शामिल नहीं हैं।
कॉन्सटेंटिन गैलबेनु

1
@e_i_pi जहां ऑपरेशन में एक से अधिक एग्रीगेट शामिल हैं। उदाहरण के लिए, एक व्यक्ति की बैंकअकाउंट्स (एग्रीगेट्स) (एक अन्य एग्रीगेट) एक डोमेन सेवा की सूची को देखते हुए, उन खातों के कुल शेष की गणना करेगा।
कांस्टेंटिन गैलबेनु

1
@e_i_pi: मुझे लगता है कि आपके पास कुछ गलत धारणाएं हैं। तो, संपूर्ण डोमेन लेयर आपके डोमेन का एक सॉफ्टवेयर मॉडल है। आपने कहा - "डेटा ऑब्जेक्ट्स (एग्रीगेट्स, एंटिटीज़ और वैल्यू ऑब्जेक्ट्स) को होल्ड करने के साथ-साथ - ये" डेटा ऑब्जेक्ट्स "इस अर्थ में नहीं हैं कि वे सिर्फ डेटा होल्ड करते हैं; ये वास्तव में डोमेन नियमों को लागू करते हैं, वे व्यवहार को परिभाषित करते हैं। अब, डोमेन सेवा , के अनुसार ई इवांस द्वारा DDD बुक , के वे पहलू हैं डोमेन है कि एक वस्तु (एक इकाई या एक मूल्य वस्तु) में स्वाभाविक रूप से फिट नहीं है।
फिलिप मिलोवानोविक

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

1

मैं डीडीडी में सेवाओं को डिपेंडेंसी इनवर्सन के परिणाम के रूप में देखता हूं ।

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

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

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


आपके उत्तर के लिए धन्यवाद, दोनों जवाबों ने मुझे "अहा!" पल। मुझे लगता है कि आपके जवाब के बिना मैं पूरी तरह से अवधारणा को समझ नहीं पाया था, लेकिन मैं कॉन्स्टेंटाइन के जवाब को भविष्य के पाठकों के लिए एक संकेतक के रूप में पसंद करता हूं।
e_i_pi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.