एपीआई और आवेदन के बीच वस्तुओं को साझा करने के लिए पैटर्न


9

मुझे अपने वेब एप्लिकेशन के लिए डिज़ाइन के बारे में गंभीर संदेह है।

मैं व्यापार तर्क को इंटरफ़ेस से अलग करना चाहता था इसलिए मैंने एक वेब एपीआई बनाया जो डेटाबेस के सभी अनुरोधों को संभालता है।

यह एक ASP.NET वेब एपीआई इकाई ढांचे और काम और सामान्य रिपोजिटरी पैटर्न की एक इकाई के साथ है। अब तक, सब कुछ अच्छा है।

मुसीबत

जहाँ मुझे मदद की ज़रूरत है, मैं एपीआई और एप्लिकेशन के बीच वस्तुओं को साझा करने के एक कुशल तरीके का पता नहीं लगा सकता।

मैं सीधे इकाई वस्तु को क्रमबद्ध नहीं करना चाहता, मैंने सोचा कि यह एक बुरा अभ्यास होगा क्योंकि यदि इकाई मॉडल में बदलाव होता है, तो मैं बिना किसी कारण के बड़ी वस्तुओं को क्रमबद्ध करने के साथ समाप्त हो सकता हूं।

अब इसे कैसे लागू किया जाता है

चूँकि मेरा इंटरफ़ेस C # में ASP.NET वेब अनुप्रयोग है और मेरा API C # में है, मैंने अपने सभी वर्गों की परिभाषा के साथ एक सामान्य पुस्तकालय बनाया, जिसे मैं उनके बीच साझा करना चाहता हूं।

मुझे पता है कि समाधान तब काम नहीं करेगा जब मैं एक एंड्रॉइड ऐप विकसित करूंगा, मुझे अपनी कक्षाएं फिर से जावा में बनानी होंगी लेकिन यह मेरी सबसे बड़ी समस्या नहीं है।

समस्या यह है कि मुझे लगता है कि मैं हमेशा अपनी वस्तुओं को परिवर्तित कर रहा हूं।

उदाहरण

यहाँ मेरे काम प्रवाह का एक उदाहरण है:

मैं अपने फॉर्म के लिए सभी ऑब्जेक्ट्स और डेटा एनोटेशन के साथ एक मॉडल के साथ शुरू करता हूं फिर उपयोगकर्ता उस मॉडल को एक नियंत्रक के साथ पोस्ट कर देगा।

नियंत्रक में मुझे अपने सामान्य पुस्तकालय में इस मॉडल को एक वर्ग में बदलना होगा फिर उस वस्तु को मेरे एपीआई में भेजें।

फिर मेरे एपीआई में एक नियंत्रक कॉल को पकड़ता है और डेटाबेस को अपडेट करने के लिए उस ऑब्जेक्ट को एक इकाई ऑब्जेक्ट में परिवर्तित करता है।

इसलिए मेरे पास 3 कक्षाएं हैं

  1. सत्यापन के लिए सभी डेटा एनोटेशन के साथ देखने के लिए मॉडल (ग्राहक)
  2. वस्तुओं को साझा करने के लिए सामान्य पुस्तकालय कक्षाएं (DLL)
  3. इकाई वर्ग (एपीआई)

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


यदि मेरा प्रश्न स्पष्ट नहीं है, तो प्रश्न पूछने में संकोच न करें।
मार्क

मेरे लिए यह स्पष्ट नहीं है कि आपने किस आर्किटेक्चर को लागू किया (हो सकता है कि यह .net वर्डिंग है कि पहेलियाँ मुझे) - क्या यह एक 3 स्तरीय आर्किटेक्चर है: क्लाइंट, सर्वर, डीबी?
एंडी

हां मेरे पास एक वेब एप्लिकेशन है जो एक वेब एपीआई का उपयोग करता है। एपीआई डेटाबेस के साथ व्यापार तर्क के साथ एक है।
मार्क

जवाबों:


12

मुझे पता है कि ऐसा लग सकता है कि आप अपने डेटाबेस ऑब्जेक्ट्स, अपने डेटा ट्रांसफर ऑब्जेक्ट्स, अपने क्लाइंट ऑब्जेक्ट्स को सत्यापन तर्क के साथ और उसके बीच हर समय वस्तुओं को परिवर्तित कर रहे हैं, लेकिन मैं कहता हूं कि नहीं, आप कुछ भी गलत नहीं कर रहे हैं ।

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

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

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

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

मुझे इस तरह के विभिन्न ऑब्जेक्ट प्रकारों के बीच रूपांतरण कोड लिखने से भी नफरत है, लेकिन मेरा समाधान आमतौर पर निम्नलिखित में से एक है:

  • एक पुस्तकालय का उपयोग करें जो आपके लिए अधिकांश वस्तु रूपांतरण भारी उठाने का काम करता है - उदाहरण के लिए, यदि आप C # का उपयोग करते हैं तो आप शानदार AutoMapper पुस्तकालय ( http://automapper.org/ ) का उपयोग कर सकते हैं । मेरा मानना ​​है कि इस तरह के अन्य पुस्तकालयों की एक जोड़ी है, लेकिन ऑटोमैपर सबसे शक्तिशाली है जिसे मैंने अब तक देखा है।
  • यदि आपको कोई लाइब्रेरी नहीं मिल रही है तो आप अपने ऑब्जेक्ट रूपांतरणों में मदद कर सकते हैं, उनके बीच कनवर्ट करने के लिए उपयोगिता विधियों का एक सेट लिखें। यह चूसना हो सकता है, लेकिन यह लंबे समय में इसके लायक है, पहली बार रूपांतरण विधि लिखें जब आपको कुछ बदलने की आवश्यकता होती है - प्रतीक्षा न करें।

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

1
मैं यह नहीं कह रहा हूं कि आपको एपीआई स्तर पर मान्य नहीं होना चाहिए। ईमानदार होने के लिए, यह मान्य करने के लिए सबसे महत्वपूर्ण स्थान है। अपने ऐप में मान्य करना आपके उपयोगकर्ताओं को गलतियाँ न करने में मदद करने के लिए सिर्फ एक "अच्छी सुविधा" है, अपने डेटा ट्रांसफर ऑब्जेक्ट्स को मान्य करना दुर्भावनापूर्ण और गलत डेटा को बाहर रखने के लिए है। चूंकि ये अलग-अलग उपयोग के मामले हैं, इसलिए आपको अलग-अलग सत्यापन फ्रेमवर्क का उपयोग करने की आवश्यकता हो सकती है ( यदि आपके ऐप और आपके एपि को एक ही भाषा में नहीं लिखा गया है) तो आप अलग-अलग सत्यापन फ्रेमवर्क का उपयोग करेंगे और आप प्रत्येक स्तर पर कुछ अलग चीजों को मान्य कर सकते हैं (कंटेंट) (अगली टिप्पणी में)
१४'१४

1
इसलिए आपको अपने डेटा ट्रांसफर ऑब्जेक्ट को मान्य करना चाहिए। लेकिन आपको यह भी सुनिश्चित करना चाहिए कि जिस तरह से आप उन्हें मान्य करते हैं, वह किसी अन्य ढांचे पर किसी निर्भरता का परिचय नहीं देता है । और निश्चित रूप से, जैसा कि मैंने पहले कहा था, आप वास्तव में यह सुनिश्चित नहीं कर सकते हैं कि आपके डेटा ट्रांसफर ऑब्जेक्ट्स को सभी में मान्य किया गया है या उन्हें एक ही फ्रेमवर्क द्वारा मान्य किया गया है - इसलिए आपको "दो बार मान्य" होना चाहिए।
१४'१४

2
मुख्य रूप से, आपको अपने आवेदन और अपने एपीआई को दो पूरी तरह से अलग और अलग-अलग अनुप्रयोगों के रूप में देखने की कोशिश करनी चाहिए। आप एक ही समय में उनका अवमूल्यन कर सकते हैं, और वे एक ही दृश्य स्टूडियो समाधान / ग्रहण परियोजना में हो सकते हैं। लेकिन वे वास्तव में दो पूरी तरह से अलग कार्यक्रम हैं। जब आप अपने एप्लिकेशन में काम कर रहे हों, तो "भूलने" का प्रयास करें कि आप वही हैं, जिसने एपीआई बनाया है और इसे वैसे ही उपयोग करें जैसे आप सामान्य 3 जी एपीआई के साथ करते हैं। इस तरह आपके पास यह देखने का एक बेहतर मौका होगा कि आपके एपीआई का उपयोग करते समय अन्य लोग कैसा महसूस करेंगे और सबसे खराब भागों को जल्दी से ठीक कर लेंगे।
wasatz

1
और यह समान रूप से सच है जब आपके एपीआई प्रोजेक्ट पर काम कर रहा है, तो यह कल्पना करने की कोशिश करें कि आप एक ऐसी सेवा लिख ​​रहे हैं जिसे कई 3 पार्टी डेवलपर्स उपयोग करने जा रहे हैं। अपने वर्तमान एप्लिकेशन के बारे में बहुत अधिक सोचने की कोशिश न करें, बल्कि अपने दिमाग को "मैं क्या सेवाएं प्रदान कर रहा हूं" पर अधिक ध्यान रखने के लिए और यह मानते हुए कि जो हर कोई आपके एपीआई का उपयोग कर रहा है (खुद सहित) दुष्ट लोग हैं जो आपके सर्वर को मारने की कोशिश कर रहे हैं और आप अपने पूरे डेटाबेस को हटा दें।
१०
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.