बाकी एपीआई - डीटीओ या नहीं? [बन्द है]


154

मैं वर्तमान में एक प्रोजेक्ट के लिए REST-API बना रहा हूं और सर्वोत्तम प्रथाओं के बारे में लेख पढ़ रहा हूं। कई डीटीओ के खिलाफ प्रतीत होते हैं और बस केवल डोमेन मॉडल को उजागर करते हैं, जबकि अन्य लोगों को लगता है कि डीटीओ (या उपयोगकर्ता मॉडल या जिसे आप इसे कॉल करना चाहते हैं) खराब अभ्यास हैं। व्यक्तिगत रूप से, मुझे लगा कि इस लेख ने बहुत कुछ समझा ।

हालाँकि, मैं सभी अतिरिक्त मैपिंग कोड, डोमेन मॉडल के साथ डीटीओ की कमियां भी समझता हूं जो उनके डीटीओ-समकक्ष और इसी तरह 100% हो सकते हैं।

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

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

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


9
अगर यह सवाल बंद हो जाए तो हैरान मत होना। यह एक चर्चा आधारित प्रश्न का अधिक अर्थ है जिसका कोई स्पष्ट सही उत्तर नहीं है। विभिन्न लोगों से पूछें और आपको एक अलग उत्तर मिलेगा।
बेन थर्ले

2
वह लेख लिंक ( ibm.com/developerworks/community/blogs/barcia/entry/… ) टूट गया है।
गुलाबी रंग

7
@pinkpanther यह एक शानदार लेख है और यह एक दया है जो अब उपलब्ध नहीं है। यहाँ वेब आर्काइव कैश्ड वर्जन है
कैसियोमोलिन

जवाबों:


251

आपको अपने REST API में DTO का उपयोग क्यों करना चाहिए

DTO का मतलब D ata T ransfer O bject है

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

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

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


दृढ़ता मॉडल के बजाय डीटीओ को उजागर करने के कुछ लाभों का उल्लेख करने के लिए:

  • एपीआई मॉडल से वास्तविक दृढ़ता मॉडल।

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

  • डीटीओ का उपयोग करके, आप अपनी दृढ़ता संस्थाओं में एनोटेशन के एक नरक से बचेंगे , अर्थात, आपकी दृढ़ता संस्थाओं को गैर-दृढ़ता से संबंधित एनोटेशन के साथ फूला नहीं होगा।

  • संसाधन बनाते या अद्यतन करते समय आपको प्राप्त होने वाली विशेषताओं पर आपका पूर्ण नियंत्रण होगा ।

  • यदि आप स्वैगर का उपयोग कर रहे हैं , तो आप अपनी दृढ़ता मॉडल को गड़बड़ाने के बिना अपने एपीआई मॉडल का दस्तावेजीकरण करने के लिए उपयोग @ApiModelऔर @ApiModelPropertyएनोटेशन कर सकते हैं ।

  • आपके एपीआई के प्रत्येक संस्करण के लिए अलग-अलग डीटीओ हो सकते हैं।

  • संबंधों को मैप करते समय आपके पास अधिक लचीलापन होगा।

  • विभिन्न मीडिया प्रकारों के लिए आपके पास अलग-अलग डीटीओ हो सकते हैं।

  • आपके डीटीओ के पास HATEOAS के लिंक की सूची हो सकती है । यह उस तरह की चीज है जिसे दृढ़ता वस्तुओं में नहीं जोड़ा जाना चाहिए। स्प्रिंग हेटोस का उपयोग करते समय , आप अपने डीटीओ वर्गों को विस्तार RepresentationModel(पहले के रूप में जाना जाता है ResourceSupport) कर सकते हैं या उन्हें EntityModel(पहले के रूप में जाना जाता है Resource<T>) के साथ लपेट सकते हैं ।

बॉयलरप्लेट कोड के साथ काम करना

आप विपरीत DTOs और उपाध्यक्ष के लिए अपने हठ संस्थाओं को मैप करने की जरूरत नहीं होगी mannually । रहे हैं कई मानचित्रण चौखटे आप यह करने के लिए उपयोग कर सकते हैं। उदाहरण के लिए, MapStruct पर एक नज़र है , जो एनोटेशन आधारित है और मावेन एनोटेशन प्रोसेसर के रूप में काम करता है। यह सीडीआई और स्प्रिंग-आधारित दोनों अनुप्रयोगों में अच्छा काम करता है।

आप यह भी विचार कर सकते हैं लंबोक उत्पन्न करने के लिए ही टिककर खेल, setters, equals(), hashcode()और toString()आप के लिए तरीके।


संबंधित: अपने डीटीओ वर्गों को बेहतर नाम देने के लिए, इस उत्तर को देखें ।


2
अगर मैं DTO के रास्ते पर जाता, तो क्या आप सभी डोमेन ऑब्जेक्ट्स को DTO या सिर्फ उन लोगों के लिए मैप करते, जो एक समान नहीं होते? इसके अलावा, आप विभिन्न परिदृश्यों / संदर्भों के आधार पर डेटा को उजागर करने की समस्या को कैसे हल करेंगे? डोमेन ऑब्जेक्ट प्रति एकाधिक डीटीओ?
बेन्बजो

6
@benbjo यह आप पर निर्भर है। मैं आमतौर पर डीटीओ के लिए केवल सबसे जटिल इकाइयाँ मैप करता हूं, जिन संस्थाओं को मैं नहीं चाहता कि सभी विशेषताओं को उजागर किया जाए और बहुत सारे रिश्तों के साथ संस्थाओं को। डीटीओ मुझे HATEOAS में उपयोग किए जाने वाले लिंक की एक सूची रखने की सुविधा देते हैं। यही कारण है कि मैं अपनी दृढ़ता वस्तुओं में नहीं जोड़ूंगा।
कैसियोमोलिन

2
@molin जानकारी और सुझावों के लिए बहुत बहुत धन्यवाद। मैं निश्चित रूप से MapStruct बाहर की जाँच करेगा। एक नज़र में यह मेरी जरूरतों के हिसाब से बहुत अच्छा लगता है।
बेन्बजो

6
प्रिय डाउनवॉटर, क्या आप कम से कम अपने डाउनवोट का कारण बता सकते हैं?
कैसियोमोलिन

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

25

जब आपका एपीआई सार्वजनिक होता है और आपको कई संस्करणों का समर्थन करना होता है, तो आपको डीटीओ के साथ जाना होगा।

दूसरी ओर, यदि यह निजी एपीआई है और आप क्लाइंट और सर्वर दोनों को नियंत्रित करते हैं, तो मैं डीटीओ को छोड़ देता हूं और सीधे डोमेन मॉडल को उजागर करता हूं।


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

11

मैं डीटीओ का उपयोग करता हूं।

मुझे कमियां पसंद नहीं हैं, लेकिन ऐसा लगता है कि अन्य विकल्प भी बदतर हैं:

डोमेन ऑब्जेक्ट्स के एक्सपोजर से सुरक्षा संबंधी समस्याएं और डेटा लीक हो सकती हैं। जैक्सन एनोटेशन समस्या को हल करने के लिए लग सकता है लेकिन गलती करना और डेटा को उजागर करना बहुत आसान है जिसे उजागर नहीं किया जाना चाहिए। डीटीओ क्लास डिजाइन करते समय ऐसी गलती करना बहुत कठिन है।

दूसरी ओर डीटीओ दृष्टिकोण की खामियों वस्तु मानचित्रण और करने के लिए वस्तु की तरह चीजों के साथ कम किया जा सकता लंबोक कम बॉयलरप्लेट के लिए।


9

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

यह मुख्य रूप से json / rest api के प्रतिक्रिया पक्ष के लिए सही है। मैंने इन मामलों के लिए कई json views / filter लिखने से बचने के लिए जैकसन एडऑन भी लिखा: https://github.com/Antibrumm/jackson-antpathfilter

दूसरी ओर डीटीओ ऐसे एपीआई के अनुरोध इनपुट पक्ष पर एक अच्छी बात है। संस्थाओं पर सीधे काम करना बहुत कठिन हो सकता है उदाहरण के लिए द्विदिश संबंधों को ध्यान में रखते हुए। इसके अलावा आप वास्तव में उदाहरण के लिए एक "निर्माता" विशेषता को संशोधित करने देना नहीं चाहते हैं। इसलिए आपको इस तरह के अनुरोधों की मैपिंग के दौरान कुछ क्षेत्रों को अलग करना होगा।


2
मैं इस बात से सहमत हूं कि मेरा प्रश्न कुछ हद तक संबंधित (और हतोत्साहित) है, हालाँकि मैं अपनी समस्या को हल करने के टिप्स भी खोज रहा था। मैं आपके जैक्सन के नशे की लत में बहुत कुछ ले जाऊंगा, लेकिन क्या आपको लगता है कि अलग-अलग स्थलों में डेटा को उजागर करने के लिए मिश्रण का उपयोग करना अच्छा है जो जाना है?
बेन्बजो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.