2015-01-22 5 views
7

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

उस मामले के बारे में जहां मुझे या तो नया मान पास करने या डेटाबेस में वापस बदलने की आवश्यकता है?

क्या मुझे अपनी प्रस्तुति परत में अपने डीएएल से डेटा मॉडल/वास्तविक इकाई के साथ सीधे काम करना चाहिए?

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

उत्तर

3

क्या मुझे अपनी प्रस्तुति परत में अपने डीएएल से डेटा मॉडल/वास्तविक इकाई के साथ सीधे काम करना चाहिए?

यह छोटे से मध्यम परियोजनाओं के लिए ठीक है। लेकिन जब आपके पास 5 से अधिक डेवलपर्स के साथ एक बड़ी परियोजना है जहां अलग-अलग टीमों को विभिन्न परतों को आवंटित किया जाता है, तो प्रोजेक्ट लेयर से डेटा लेयर को अलग करने के लिए परियोजना को डीटीओ का उपयोग करने से लाभ होता है। (इसके विपरीत)

बीच में एक डीटीओ के साथ

, प्रस्तुति परत में किसी भी बदलाव के लिए डेटा लेयर को प्रभावित नहीं करेगा

या मैं एक डीटीओ प्रस्तुति परत से करने के लिए पारित किया जा सकता है कि बनाना चाहिए व्यापार परत फिर इसे एक इकाई में परिवर्तित करें, फिर डीआर में एक ओआरएम कॉल के माध्यम से अपडेट किया जाए। क्या यह लेखन बहुत अधिक कोड है? मुझे लगता है कि प्रस्तुति परत में डेटा मॉडल की कोई अवधारणा नहीं है, तो इसकी आवश्यकता है। अगर हम इस दृष्टिकोण के साथ जा रहे हैं, तो क्या मुझे बदलाव करने से पहले ऑब्जेक्ट को बीएलएल परत पर फिर से ले जाना चाहिए?

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

UpdateUser(UserDto userDto) 
{ 
    // Fetch 
    User user = userRepository.GetById(userDto.ID); 

    // Map 
    user.FirstName = userDTO.FirstName; 
    user.LastName = userDTO.LastName; 

    // ORM Update 
    userRepository.Update(user); 
    userRepository.Commit(); 
} 

कई डेवलपर्स के साथ बड़ी परियोजनाओं के लिए, बहुत ज्यादा कोड लिखने का नुकसान decoupling यह प्रदान करता है की भारी लाभ की तुलना में कम से कम किया गया है।

Why use a DTO

+1

"किसी मौजूदा इकाई को अद्यतन करने के लिए, आप एक डीटीओ को किसी इकाई में परिवर्तित नहीं करते हैं, बल्कि आप मौजूदा इकाई को लाते हैं, नए मानों को मैप करते हैं" क्या आप उसी मैपिंग कोड को इस तरह से दो बार नहीं लिखेंगे? – Reek

1

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

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

इस आवश्यकता के कारण, डीटीओ को अपने एंटिटी समकक्ष को वापस मैप करने के लिए कभी भी उचित नहीं है।

डीटीओ हमेशा आदेश इकाई में परिवर्तन को प्रभावित करने के लिए कि यह राज्य डीटीओ द्वारा वर्णित के लिए ला सकते हैं में एआर में तर्क के माध्यम से संसाधित किया जाना चाहिए।

+0

मैं यह भी जोड़ूंगा कि यदि आप डीडीडी/सीक्यूआरएस कर रहे हैं, तो कुल रूट कभी भी डीटीओ प्रदान नहीं करेगा, क्योंकि वे दृश्य मॉडल से आएंगे। हालांकि, चूंकि प्रश्न ** डीडीडी/सीक्यूआरएस के बारे में ** नहीं है, इसलिए मुझे लगता है कि आप प्रस्तुति परत द्वारा प्रस्तुत डेटा प्राप्त करने के लिए एआर का उपयोग कर रहे हैं। – arootbeer

+1

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

+0

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

15

कुछ विचारों के बारे में मेरी पोस्ट देखें:

  • डीटीओ एक ओवरलोड अवधि है, लेकिन के रूप में यह डाटा स्थानांतरण वस्तु के लिए खड़ा है, मैं इसे के रूप में अधिक एक विशुद्ध रूप से तकनीकी देखते हैं, संभावित रूप से धारावाहिक container डेटा को एक बिंदु से दूसरे तक प्राप्त करने के लिए, आमतौर पर स्तर या शायद परतों में। व्यापार की चिंताओं से निपटने वाली एक परत के अंदर, जैसे कि डीडीडी में डोमेन परत, इन छोटे डेटा संरचनाओं को प्रसारित करने के लिए मूल्य वस्तुएं नामित की जाती हैं, क्योंकि उनके पास व्यवसाय का अर्थ होता है और डोमेन की सर्वव्यापी भाषा का हिस्सा होता है। डीटीओ और वैल्यू ऑब्जेक्ट्स के बीच सूक्ष्म अंतर के सभी प्रकार हैं, जैसे कि आपको आमतौर पर डीटीओ की तुलना करने की आवश्यकता नहीं होती है, जबकि तुलना और समानता वीओ में एक महत्वपूर्ण चिंता है (दो वीओ बराबर हैं यदि उनके encapsulated डेटा बराबर है)।

  • डीडीडी पर समृद्ध डोमेन मॉडल के विचार पर जोर दिया गया है। इसका मतलब है कि आप आम तौर पर डोमेन इकाइयों में डीटीओ के एक-से-एक को मानचित्र नहीं बनाते हैं, लेकिन अपनी संस्थाओं में इरादे-खुलासा विधियों के रूप में व्यावसायिक कार्यों को मॉडल करने का प्रयास करते हैं। उदाहरण के लिए, आप User के Street, City और ZipCode को संशोधित करने के लिए सेटर्स का उपयोग नहीं करेंगे बल्कि डोमेन परत में घोषित वैल्यू ऑब्जेक्ट होने के बजाय Address को moveTo(Address newAddress) विधि पर कॉल करें।

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

तो, मानचित्रण डीटीओ के संस्थाओं के लिए नहीं वास्तव में काम करने के DDD तरीका है, यह एक CRUD-उन्मुख दृष्टिकोण के और अधिक को दर्शाता है।

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