128

डेटा ट्रांसफर ऑब्जेक्ट क्या है?डाटा ट्रांसफर ऑब्जेक्ट क्या है?

MVC में मॉडल वर्गों डीटीओ हैं, और यदि क्या मतभेद हैं नहीं और क्या हम दोनों की आवश्यकता है?

+0

यह एक विरोधी पैटर्न है, देखें: [डेटा ट्रांसफर ऑब्जेक्ट एक शर्म है] (http://www.yegor256.com/2016/07/06/data-transfer-object.html) – yegor256

उत्तर

139

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

DTOs सबसे अधिक ही है और यूआई परत के बीच डेटा स्थानांतरित करने के लिए एक एन-टीयर आवेदन में सेवाएं परत द्वारा किया जाता है। यहां मुख्य लाभ यह है कि यह डेटा की मात्रा को कम करता है जिसे वितरित अनुप्रयोगों में तार में भेजने की आवश्यकता होती है। वे एमवीसी पैटर्न में भी महान मॉडल बनाते हैं।

डीटीओ के लिए एक और उपयोग विधि कॉल के लिए पैरामीटर को समाहित करना हो सकता है। यदि कोई विधि 4 या 5 पैरामीटर से अधिक लेती है तो यह उपयोगी हो सकता है।

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

डोमेन ऑब्जेक्ट से डीटीओ में रूपांतरण और फिर से एक महंगा प्रक्रिया हो सकती है। यदि आप एक वितरित अनुप्रयोग नहीं बना रहे हैं, तो संभवतः आपको Martin Fowler explains here

+4

"डीटीओ एमवीसी पैटर्न में महान मॉडल बनाते हैं" - लेकिन क्या मॉडल में ऑब्जेक्ट के सभी डेटा और डीटीओ को डेटा के हिस्से के साथ अनुकूलित नहीं किया जाना चाहिए? यदि मेरे पास मॉडल ए है और मुझे इसे दो उपप्रणाली में पास करने की आवश्यकता है, तो प्रत्येक के प्रासंगिक फ़ील्ड के साथ A_DTO_1 और A_DTO_2 होगा? "डीटीओ विधि कॉल के लिए पैरामीटर को समाहित करने के लिए हो सकता है" -> तो पैरामीटर को लपेटने वाली प्रत्येक कक्षा डीटीओ है भले ही यह वितरित सिस्टम न हो? डोमेन ऑब्जेक्ट में एमवीसी में मॉडल नहीं हैं? –

+2

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

+7

"डीटीओ के लिए एक और उपयोग विधि कॉल के लिए पैरामीटर को समाहित करना हो सकता है। यदि कोई विधि 4 या 5 पैरामीटर से अधिक लेती है तो यह उपयोगी हो सकता है।" यह वास्तव में एक विरोधी पैटर्न है जिसे पोल्टरगेस्ट या जिप्सी वैगन वर्ग कहा जाता है। यदि आपकी विधि को 4 तर्कों की आवश्यकता है तो इसे 4 दें, किसी ऑब्जेक्ट को विधि या कक्षा में स्थानांतरित करने के लिए कक्षा न बनाएं। – Wix

3
MVC आंकड़ा अंतरण वस्तुओं के साथ

अक्सर सरल वस्तुओं है कि अंततः दृश्य द्वारा प्रदर्शित हो जाएगी करने के लिए डोमेन मॉडल मैप करने के लिए उपयोग किया जाता है।

Wikipedia से:

डेटा स्थानांतरण वस्तु (डीटीओ), पूर्व मूल्य वस्तुओं या VO के रूप में जाना जाता है, एक डिजाइन सॉफ्टवेयर अनुप्रयोग उप के बीच डेटा स्थानांतरित करने के लिए प्रयोग किया जाता पैटर्न है। डेटाबेस से डेटा पुनर्प्राप्त करने के लिए डीटीओ का उपयोग अक्सर डेटा एक्सेस ऑब्जेक्ट्स के संयोजन के साथ किया जाता है।

20

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

14

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

MVC में आमतौर पर मॉडल वर्गों (.net MVC यहाँ कल्पना करते हुए) DTOs, या संग्रह/DTOs

के योग हैं
+0

आप जो वर्णन कर रहे हैं वह है एक LocalDTO: http://martinfowler.com/bliki/LocalDTO.html – Rui

+1

एक मामले में जहां यह एक डीटीओ की तरह कुछ का उपयोग करने के लिए उपयोगी है आप अपनी प्रस्तुति परत और अंतर्निहित डोमेन मॉडल में मॉडल के बीच एक महत्वपूर्ण बेमेल है जब है। इस मामले में प्रेजेंटेशन विशिष्ट मुखौटा/गेटवे बनाने के लिए यह समझ में आता है जो डोमेन मॉडल से मानचित्र करता है और प्रस्तुति के लिए सुविधाजनक इंटरफ़ेस प्रस्तुत करता है। –

7

सामान्य वैल्यू ऑब्जेक्ट्स अपरिवर्तनीय होना चाहिए, पैटर्न से कोई भी शानदार लाभ नहीं दिखाई देगा। इंटीजर या स्ट्रिंग जावा में ऑब्जेक्ट्स की तरह। हम सॉफ्टवेयर परतों के बीच डेटा स्थानांतरित करने के लिए उनका उपयोग कर सकते हैं। यदि सॉफ़्टवेयर परतें या सेवाएं विभिन्न रिमोट नोड्स में चल रही हैं जैसे सूक्ष्मजीव वातावरण या विरासत जावा एंटरप्राइज़ ऐप में। हमें दो वर्गों की लगभग सटीक प्रतियां बनाना चाहिए। यह वह जगह है जहां हम डीटीओ से मिले थे।

|-----------|             |--------------| 
| SERVICE 1 |--> Credentials DTO >--------> Credentials DTO >-- | AUTH SERVICE | 
|-----------|             |--------------| 

विरासत में जावा एंटरप्राइज़ सिस्टम डीटीओ में विभिन्न ईजेबी सामान हो सकते हैं।

मैं इस एक सबसे अच्छा अभ्यास है या नहीं लेकिन मैं व्यक्तिगत रूप से मूल्य इस तरह मेरी स्प्रिंग MVC/बूट परियोजनाओं में ऑब्जेक्ट्स का उपयोग नहीं जानता:

 |------------|   |------------------|        |------------| 
-> Form |   | -> Form |     | -> Entity     |   | 
     | Controller |   | Service/Facade |        | Repository | 
<- View |   | <- View |     | <- Entity/Projection View |   | 
     |------------|   |------------------|        |------------| 

नियंत्रक परत क्या कर रहे हैं पता नहीं है संस्थाएं हैं। यह फार्म और देखें मूल्य ऑब्जेक्ट्स के साथ संचार। फार्म वस्तुओं JSR 303 मान्यता टिप्पणियां हैं (उदाहरण के लिए @NotNull) और देखें मूल्य ऑब्जेक्ट्स कस्टम क्रमांकन के लिए जैक्सन एनोटेशन की है। (उदाहरण के @JsonIgnore के लिए)

सेवा परत इकाई वस्तुओं का उपयोग कर के माध्यम से भंडार परत के साथ संचार करता है। इकाई वस्तुओं में जेपीए/हाइबरनेट/स्प्रिंग डेटा एनोटेशन हैं। प्रत्येक परत केवल निचली परत के साथ संचार करती है। सर्कुलर/चक्रीय निर्भरता के कारण इंटर-लेयर संचार प्रतिबंधित है।

User Service ----> XX CANNOT CALL XX ----> Order Service 

कुछ ORM फ़्रेमवर्क अतिरिक्त इंटरफेस या वर्गों का उपयोग के माध्यम से प्रक्षेपण की क्षमता है। तो भंडार सीधे वस्तुओं को वापस कर सकते हैं। वहां आपके लिए एक अतिरिक्त परिवर्तन की आवश्यकता नहीं है।

उदाहरण के लिए यह हमारी उपयोगकर्ता इकाई है:

@Entity 
public final class User { 
    private String id; 
    private String firstname; 
    private String lastname; 
    private String phone; 
    private String fax; 
    private String address; 
    // Accessors ... 
} 

लेकिन आप उन है कि बस आईडी, firstname, lastname शामिल की एक पृष्ठांकित सूची वापस आ जाएगी। फिर आप ओआरएम प्रोजेक्शन के लिए व्यू वैल्यू ऑब्जेक्ट बना सकते हैं।

public final class UserListItemView { 
    private String id; 
    private String firstname; 
    private String lastname; 
    // Accessors ... 
} 

आप आसानी से भंडार परत से पृष्ठांकित परिणाम प्राप्त कर सकते हैं। वसंत के लिए धन्यवाद आप अनुमानों के लिए केवल इंटरफेस का उपयोग कर सकते हैं।

List<UserListItemView> find(Pageable pageable); 

अन्य रूपांतरण संचालन के लिए चिंता न करें BeanUtils.copy विधि ठीक काम करता है।

4

1) मेरे लिए सवाल क्या एक डीटीओ है कि DTOs सरल वस्तुओं है कि किसी भी व्यापार तर्क या तरीकों कार्यान्वयन कि परीक्षण की आवश्यकता होगी शामिल नहीं होना चाहिए रहे हैं के लिए सबसे अच्छा जवाब।

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

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