डीटीओ उपयोग के लिए इकाई


15

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

मूल प्रवाह मैं इस प्रकार है:

  1. यूआई मॉडल / फॉर्म -> नियंत्रक
  2. नियंत्रक मॉडल को डोमेन ऑब्जेक्ट (इकाई) में परिवर्तित करता है
  3. डोमेन ऑब्जेक्ट -> सेवा परत
  4. डोमेन ऑब्जेक्ट -> DAO
  5. DAO -> डोमेन ऑब्जेक्ट (ओं)
  6. सेवा -> UI
  7. यूआई डोमेन को यूआई मॉडल में परिवर्तित करता है

यदि डीटीओ का पालन किया गया तो डीएओ एंटिटी न होकर एक डीटीओ को वापस कर देगा। कुछ पढ़ने के बाद ऐसा लगता है कि डीटीओ थोड़ा कम हो गया है क्योंकि (कम से कम जावा में) इकाइयां एनोटेट हो गई हैं, जिसका अर्थ है कि उनकी मेमोरी पदचिह्न बहुत छोटी हो गई है।

क्या यह मामला है, या DTO का उपयोग DAO परत के भीतर डोमेन ऑब्जेक्ट्स को पूरी तरह से एनकैप्सुलेट करने के लिए किया जाना चाहिए, और, अगर यह मामला है, तो DAO में सर्विस लेयर पास क्या होगा?

बहुत बहुत धन्यवाद!

जवाबों:


20

मेरे अनुसार, एक स्थायी POJO गुजरना, उदाहरण के लिए JPA द्वारा प्रबंधित बीन, अच्छा अभ्यास नहीं है।

क्यों?

मैं तीन मुख्य कारण देखता हूं:

  1. आलसी संग्रह के साथ संभावित मुद्दा। http://java.dzone.com/articles/avoid-lazy-jpa-collections
  2. इकाई में व्यवहार होना चाहिए (एक एनीमिक डोमेन मॉडल के विपरीत ) आप अपने यूआई को कुछ अप्रत्याशित व्यवहार को कॉल करने नहीं देना चाह सकते हैं।
  3. एनीमिक डोमेन मॉडल के मामले में आप यूआई के लिए अपनी मॉडल संरचना को उजागर नहीं करना चाह सकते हैं, क्योंकि मॉडल में हर नया परिवर्तन यूआई को तोड़ सकता है।

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


इसलिए अगर मैं इसे सही ढंग से समझ रहा हूं, तो सेवा अनिवार्य रूप से केवल डीटीओ वस्तुओं से संबंधित है, और यूआई और डीएओ दोनों के मध्यस्थ के रूप में कार्य करती है। इसके अलावा, 3 बिंदु पर, आपको अभी भी अपने डीटीओ को काम करने योग्य यूआई तत्वों में बदलना होगा, इसलिए एक डोमेन अपडेट अभी भी यूआई को नहीं तोड़ देगा क्योंकि डीटीओ को भी अपडेट की आवश्यकता है।
प्रातः

1
@dardo यूआई तत्व डीटीओ हैं या सबसे खराब, सर्वर-साइड पर कुछ सेवाओं को कॉल करने से पहले डीटीओ में परिवर्तित किया जाना चाहिए। डीटीओ को अक्सर बदलने की संभावना नहीं होती है, यूआई की जरूरतों पर ध्यान केंद्रित करने वाली आपकी संस्थाओं से सिर्फ अनुकूलन होता है। इसके अलावा, सेवा परत को दोनों के बारे में ध्यान देना चाहिए: डीटीओ और इकाइयां।
मिक 378

आह ठीक है, वहाँ हिचकी मैं समझ नहीं रहा था। एनीमिक डोमेन मॉडल बहुत सामान्य है जहां मैं काम करता हूं, और मैं एक पतली सेवा परत को प्रोत्साहित करने के लिए प्रतिमान को थोड़ा स्थानांतरित करने की कोशिश कर रहा हूं। एक बार फिर धन्यवाद!
प्रातः

@ डार्डो आप इस पुस्तक को पढ़ सकते हैं। (या इसे अपनी कंपनी को दिखाओ;)) महान महान पुस्तक: amazon.com/Implementing-Domain-Driven-Design-Vaughn-Vernon/dp/…
मिका 378

वास्तव में यह एक किंडल पर है, amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/ ... बहुत अच्छा अब तक = D
dardo

13

जिन कारणों से मुझे लगता है कि यह चर्चा बार-बार सामने आती है, क्योंकि यह एक गंभीर दर्द की तरह लगता है, जिसमें आपको अपनी ज़रूरत के सभी डेटा के साथ एक ऑब्जेक्ट लेने और उसे एक ऑब्जेक्ट में बदलने के लिए मिलता है जो समान या लगभग एक जैसा दिखता है आप हाथ बँटा रहे हैं।

यह सच है, यह एक 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);

    }

इनपुट के लिए धन्यवाद, और मेरी सोच एक ही पंक्तियों के साथ है =)
डारडो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.