जिन कारणों से मुझे लगता है कि यह चर्चा बार-बार सामने आती है, क्योंकि यह एक गंभीर दर्द की तरह लगता है, जिसमें आपको अपनी ज़रूरत के सभी डेटा के साथ एक ऑब्जेक्ट लेने और उसे एक ऑब्जेक्ट में बदलने के लिए मिलता है जो समान या लगभग एक जैसा दिखता है आप हाथ बँटा रहे हैं।
यह सच है, यह एक PITA है। लेकिन ऐसा करने के लिए कुछ कारण हैं (ऊपर उन लोगों के अलावा)।
- डोमेन ऑब्जेक्ट बहुत भारी हो सकते हैं और कॉल के लिए बहुत सारी बेकार जानकारी हो सकती है। यह ब्लॉट यूआई को धीमा कर देता है क्योंकि सभी डेटा ट्रांसमिटेड, मार्शल्ड / अनमार्शल्ड और पार्स होता है। जब आप मानते हैं कि एक FE में आपके webservices का जिक्र करने वाले कई लिंक होंगे और AJAX या कुछ अन्य मल्टी-थ्रेड दृष्टिकोण के साथ बुलाया जा रहा है, तो आप जल्दी से अपने UI को सुस्त बना देंगे। यह सब webservices की सामान्य मापनीयता के लिए हो जाता है
- बहुत अधिक डेटा को उजागर करके सुरक्षा से आसानी से समझौता किया जा सकता है। यदि आप डीटीओ परिणाम से उन्हें समाप्त नहीं करते हैं तो कम से कम आप उपयोगकर्ताओं के ईमेल पते और फोन नंबर उजागर कर सकते हैं।
- प्रैक्टिकल विचार: 1 ऑब्जेक्ट के लिए एक प्रचलित डोमेन ऑब्जेक्ट और डीटीओ के रूप में परेड करने के लिए कोड से अधिक एनोटेशन होना चाहिए। आपके पास ऑब्जेक्ट की स्थिति को प्रबंधित करने के साथ कोई भी समस्या होगी क्योंकि यह परतों से होकर गुजरता है। सामान्य तौर पर यह प्रबंधन करने के लिए एक पीटीए से बहुत अधिक होता है, फिर एक डोमेन ऑब्जेक्ट से एक डीटीओ के लिए खेतों की प्रतिलिपि बनाने का टेडियम।
लेकिन, यदि आप अनुवाद तर्क को कनवर्टर कक्षाओं के संग्रह में शामिल कर लेते हैं, तो आप इसे प्रभावी ढंग से प्रबंधित कर सकते हैं
LambdaJ पर एक नज़र डालें जहाँ आप 'कन्वर्ट (डोमेनओबीजे, टूड्टो) कर सकते हैं' संग्रह के साथ उपयोग के लिए इसका एक अधिभार है। यहां एक नियंत्रक विधि का एक उदाहरण है जो इसका उपयोग करता है। जैसा कि आप देख सकते हैं, यह इतना बुरा नहीं लगता है।
@GET
@Path("/{id}/surveys")
public RestaurantSurveys getSurveys(@PathParam("id") Restaurant restaurant, @QueryParam("from") DateTime from, @QueryParam("to") DateTime to) {
checkDateRange(from, to);
MultiValueMap<Survey, SurveySchedule> surveysToSchedules = getSurveyScheduling(restaurant, from, to);
Collection<RestaurantSurveyDto> surveyDtos = convert(surveysToSchedules.entrySet(), SurveyToRestaurantSurveyDto.getInstance());
return new RestaurantSurveys(restaurant.getId(), from, to, surveyDtos);
}