2013-07-31 6 views
10

मैं डीडीडी अवधारणाओं के आस-पास डोमेन के साथ मानक वेब एप्लिकेशन पर काम करता हूं। मैं सोच रहा हूं कि मेरी एप्लिकेशन सेवाओं को किस तरह की वस्तुओं को स्वीकार करना चाहिए और वापस जाना चाहिए। मान लें कि मेरे पास User कुल के लिए एक एप्लिकेशन सेवा है।आवेदन सेवा पैरामीटर/वापसी प्रकार

1) DTOs/सरल प्रकार (स्ट्रिंग, पूर्णांक आदि)

public interface UserApplicationService { 
    void registerUser(UserDTO userDTO); 
    List<UserDTO> getUsersForOrganization(String organizationId); 
} 

इस मामले में, आवेदन सेवा डोमेन वस्तुओं और इसका विपरीत कोडांतरक बदलने DTOs फोन करने के लिए जिम्मेदार है।

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

नुकसान यह है कि फॉर्मों के मामले में, सत्यापन डीटीओ पर आधारित होना चाहिए। इसलिए मेरे सत्यापन नियम डोमेन के बीच डुप्लिकेट किए गए हैं (ऑब्जेक्ट इसके राज्य के लिए ज़िम्मेदार है) और डीटीओ सत्यापन नियम। (Spring MVC sample application के मामले में)। इसके अलावा, अगर कुछ हिस्सों को मॉडल के दूसरे रूप की आवश्यकता होती है (मान लीजिए कि उपयोगकर्ता डीटीओ के पास प्रस्तुत करने के लिए पर्याप्त जानकारी नहीं है), मुझे आवेदन सेवा से लौटाए गए कुछ डीटीओ पर एक और डीटीओ और आधार बनाना होगा, एक और लिखें , देखने के द्वारा प्रयोग किया जाता है।

2) डोमेन प्रकार

public interface UserApplicationService { 
    void registerUser(User user); 
    List<User> getUsersForOrganization(OrganizationId organizationId); 
} 

इस मामले में, नियंत्रक/प्रस्तोता परिवर्तन के लिए जिम्मेदार है।

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

लाभ यह हो सकता है कि नियंत्रक/प्रस्तुतकर्ता मॉडल की तैयारी के लिए जिम्मेदार है, इसलिए यह दृश्य आवश्यकताओं पर डीटीओ आधार तैयार कर सकता है। उदाहरण के लिए, दृश्य को कुछ अतिरिक्त जानकारी की आवश्यकता हो सकती है जो #getUsersForOrganizationMethod से डीटीओ में वापस नहीं आती है। साथ ही, सत्यापन डोमेन ऑब्जेक्ट्स पर आधारित हो सकता है, इसलिए यह डीटीओ और डोमेन ऑब्जेक्ट्स के बीच डुप्लीकेट नहीं है।

3) डोमेन वस्तुओं + मुखौटा

यह तीसरा विकल्प DDDsample application में प्रयोग किया जाता है। एप्लिकेशन सेवाएं डोमेन प्रकार लौटाती हैं, लेकिन कुछ मुखौटा है जो परिवर्तन के लिए ज़िम्मेदार है। तो मेरे मामले में, नियंत्रक/प्रस्तुतकर्ता डीटीओ के साथ मुखौटा करने के लिए बातचीत करता है, मुखौटा परिवर्तन करता है और यह डोमेन ऑब्जेक्ट्स का उपयोग करके एप्लिकेशन सेवाओं के साथ बात करता है। हालांकि, मेरी विनम्र राय में यह थोड़ा जबरदस्त लगता है - बहुत सारी परतें, बहुत सारे बॉयलरप्लेट कोड। एक आवेदन सेवा के लिए यह बहुत अच्छा लग सकता है, लेकिन अगर हमारे पास दसियों थे, तो हमें समान संख्या में मुखौटा तरीकों की आवश्यकता होती है - शुद्ध नकल। इसके अतिरिक्त, लेनदेन सीमाएं कहां हैं?

उत्तर

4

+1

मैं मिश्रित समाधान पसंद करता हूं।

1) मैं डोमेन ऑब्जेक्ट्स को तर्क के रूप में उपयोग करता हूं, लेकिन तक सीमित है ValudObject एस।मेरा मानना ​​है कि की जीवन चक्र इकाई एस सावधानी से प्रबंधित की जानी चाहिए, और अधिकांश समय में दृश्य को इकाई को बहुत सरल सीआरयूडी अनुप्रयोगों को छोड़कर पर्याप्त मूल्य नहीं है। मैंने कई बार देखा कि कुछ डेवलपर्स एंटीटी कन्स्ट्रक्टर द्वारा लापरवाही से और उन्हें किसी विशेष फ़ंक्शन के लिए आवश्यक फ़ील्ड के केवल एक हिस्से के साथ पॉप्युलेट करते हैं, इससे नलपोइंटर अपवाद के लिए बग पेश करना और खराब व्यक्ति को ठीक करने के लिए असाइन किया गया है प्रविष्टि दिया गया था, यह जानने के लिए समस्या को कई तरीकों से खोजना है। इकाई एस रिपोजिटरी से पुनर्प्राप्त की गई है या फैक्टरी द्वारा मेरी परियोजनाओं में बनाई गई है।

कभी-कभी मैं सादगी के लिए पैरामीटर के रूप में कुछ फॉर्म ऑब्जेक्ट्स का उपयोग करता हूं।

2) मैं एक एमवीसी नियंत्रक का उपयोग अनुप्रयोग सेवा द्वारा लौटाए गए डोमेन ऑब्जेक्ट्स को ViewAdapter (यूई से एक componenet decouples डोमेन मॉडल) में परिवर्तित करने के लिए करता हूं, कभी-कभी कार्य को करने की आवश्यकता होती है।

3) मैं एक फसाड का उपयोग केवल जब आवेदन सेवा वेब सेवा दूरस्थ प्रक्रिया कॉल के माध्यम से अवगत कराया जाना चाहिए। Dto रों फसाडडीटीओ और डोमेन मॉडल परिवर्तित करने के लिए जिम्मेदार है इस मामले में लौट तर्क के रूप में इस्तेमाल और प्रकार और कर रहे हैं।

4) आवेदन सेवा को वेब दृश्य और दूरस्थ प्रक्रिया कॉल दोनों के संपर्क में आने की आवश्यकता है तो सत्यापन अजीब है। यह दोनों फॉर्म ऑब्जेक्ट्स और डीटीओएस पर लागू डुप्लिकेट सत्यापन का कारण बनता है। मैं केवल सरल बाधाओं को मान्य करता हूं (शून्य नहीं, कुछ नामों की लंबाई, व्यवसाय नियमों को डोमेन ऑब्जेक्ट्स द्वारा प्रोग्रामेटिक रूप से मान्य किया जाता है) क्योंकि मुझे अभी तक एक सही समाधान नहीं मिला है।

उम्मीद है कि इससे मदद मिलती है और यदि बेहतर समाधान हैं तो कृपया मुझे बताएं।

Update1:

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

2) लेनदेन सीमा आवेदन सेवा पर है। तकनीकी रूप से, डोमेन ऑब्जेक्ट को अनजाने में सीमा से बाहर संशोधित किया जा सकता है। हम टीम अनुशासन और कोड समीक्षा द्वारा इसे कवर करते हैं।

+0

अच्छा जवाब है, धन्यवाद! टिप्पणियों के युगल: 1) यदि आप आवेदन सेवाओं में VO स्वीकार करते हैं, क्या इस तरह के चेकआउट के रूप में आपरेशन के मामले में अपने पैरामीटर प्रकार हो सकता है? उत्पादों की जोड़ी आप चाहें तो एक विधि मंगलाचरण में पारित करने के लिए और आप सभी के लिए कुछ कुल करनी होंगी उन्हें-यहाँ DTOs IMHO आता है; मुझे लगता है कि फॉर्म बीन प्रस्तुति परत से संबंधित है और सेवा द्वारा स्वीकार नहीं किया जाना चाहिए। 2) आपकी लेनदेन सीमाएं कहां हैं? अगर हम सेवाओं से इकाइयों को वापस लौटते हैं तो यह नियंत्रक को इसे संशोधित करने की अनुमति देगा और संभावित रूप से कुछ अजीब मुद्दों का कारण बन जाएगा (विशेष रूप से यदि इकाई लेनदेन संबंधी प्रॉक्सी है)। –

+0

@ woof-woof कुछ अपडेट्स और मुझे "चेकआउट" और "उत्पाद" नहीं मिलते हैं, क्या आप इसे थोड़ा और समझा सकते हैं? – Hippoom

+0

मान लीजिए कि आपके पास एक दुकान एप्लिकेशन है और उपयोगकर्ता कुछ उत्पादों और उत्पादों को खरीदना चाहता है। इसलिए उपयोगकर्ता चेकआउट कर रहा है (यह मेरी समझ है :))। उपयोगकर्ता सभी या कुछ भी चेकआउट (खरीद) करना चाहता है - यही कारण है कि हमें कुल वस्तुओं और उनकी मात्रा में कुछ वस्तु की आवश्यकता होगी। –

3

मैं आम तौर पर आदेश और प्रश्नों का उपयोग करके, दृष्टिकोण के प्रति झुकाव पाता हूं।

यहां एक ब्लॉग पोस्ट का एक स्निपेट है जिसे मैं इस सप्ताह के अंत में प्रकाशित कर रहा हूं।

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

आप मेरे ब्लॉग पर इसका एक उदाहरण पा सकते हैं; http://www.jefclaes.be/2013/01/separating-command-data-from-logic-and.html

सत्यापन से संबंधित आपकी चिंताओं के संबंध में, यह ध्यान रखें कि होने मान्यता दोहराया भयानक नहीं है, http://gorodinski.com/blog/2012/05/19/validation-in-domain-driven-design-ddd/

0

मैं आपके तीनों दृष्टिकोणों का थोड़ा सा उपयोग करता हूं लेकिन एक बहुत ही सुसंगत तरीके से जो एरिक इवांस डीडीडी blue book में वर्णित परतों के सिद्धांतों का पालन करता है।

एप्लिकेशन परतों में इनपुट हमेशा सरल प्रकार (या ऑब्जेक्ट पैरामीटर उन्हें encapsulating) है, आउटपुट हमेशा डोमेन प्रकार है, और प्रेजेंटेशन परत मैपिंग को देखने के प्रकार/डीटीओ से संभालती है।

मैं एक बहुत ही इसी तरह के प्रश्न यहाँ करने के लिए अपने जवाब में इस दृष्टिकोण को रखने के लिए अपने कारणों की व्याख्या: https://stackoverflow.com/a/41230822/509891

संबंधित मुद्दे