मैं एक ऐसे एप्लिकेशन को डिजाइन करने की कोशिश कर रहा हूं जिसमें एक जटिल व्यवसाय डोमेन और एक REST API का समर्थन करने की आवश्यकता है (सख्ती से REST नहीं, लेकिन संसाधन-उन्मुख)। मुझे संसाधन-उन्मुख तरीके से डोमेन मॉडल को उजागर करने के तरीके के साथ आने में कुछ परेशानी है।
DDD में, किसी डोमेन व्यवसाय के ग्राहकों को इकाईयों और डोमेन सेवाओं द्वारा कार्यान्वित किसी भी व्यावसायिक कार्यक्षमता तक पहुँचने के लिए प्रक्रियात्मक 'एप्लीकेशन सर्विसेज' लेयर से गुजरना पड़ता है। उपयोगकर्ता इकाई को अद्यतन करने के लिए दो तरीकों के साथ एक आवेदन सेवा है उदाहरण के लिए:
userService.ChangeName(name);
userService.ChangeEmail(email);
इस एप्लिकेशन सेवा का API राज्य नहीं, आदेशों (क्रियाओं, प्रक्रियाओं) को उजागर करता है।
लेकिन अगर हमें उसी एप्लिकेशन के लिए एक RESTful API प्रदान करने की आवश्यकता है, तो एक उपयोगकर्ता संसाधन मॉडल है, जो इस तरह दिखता है:
{
name:"name",
email:"email@mail.com"
}
संसाधन-उन्मुख एपीआई राज्य को उजागर करता है , न कि आदेशों को । यह निम्नलिखित चिंताओं को जन्म देता है:
REST API के विरुद्ध प्रत्येक अद्यतन कार्रवाई संसाधन मॉडल पर अपडेट की जा रही गुणों के आधार पर एक या अधिक अनुप्रयोग सेवा प्रक्रिया कॉल पर मैप कर सकती है
प्रत्येक अपडेट ऑपरेशन, REST API क्लाइंट के लिए परमाणु जैसा दिखता है, लेकिन यह उस तरह लागू नहीं होता है। प्रत्येक एप्लिकेशन सेवा कॉल को एक अलग लेनदेन के रूप में डिज़ाइन किया गया है। एक संसाधन मॉडल पर एक क्षेत्र को अद्यतन करने से अन्य क्षेत्रों के लिए सत्यापन नियम बदल सकते हैं। इसलिए हमें यह सुनिश्चित करने के लिए सभी संसाधन मॉडल फ़ील्ड को एक साथ सत्यापित करने की आवश्यकता है कि सभी संभावित अनुप्रयोग सेवा कॉल वैध हैं इससे पहले कि हम उन्हें बनाना शुरू करें। एक बार में आदेशों के एक सेट को मान्य करना बहुत कम तुच्छ है जो एक समय में एक कर रहा है। हम उस क्लाइंट पर कैसे करते हैं जो व्यक्तिगत आदेशों को भी नहीं जानता है।
अलग-अलग क्रम में एप्लिकेशन सेवा विधियों को कॉल करने का एक अलग प्रभाव हो सकता है, जबकि REST API ऐसा दिखता है कि कोई अंतर नहीं है (एक संसाधन के भीतर)
मैं अधिक समान मुद्दों के साथ आ सकता हूं, लेकिन मूल रूप से वे सभी एक ही चीज के कारण होते हैं। एप्लिकेशन सेवा में प्रत्येक कॉल के बाद, सिस्टम की स्थिति बदल जाती है। मान्य परिवर्तन के नियम, क्रियाओं का समूह एक इकाई है जो अगला परिवर्तन कर सकती है। एक संसाधन-उन्मुख एपीआई एक परमाणु ऑपरेशन की तरह यह सब बनाने की कोशिश करता है। लेकिन इस अंतर को पार करने की जटिलता कहीं न कहीं जानी चाहिए, और यह बहुत बड़ी बात है।
इसके अतिरिक्त, यदि UI अधिक कमांड-ओरिएंटेड है, जो अक्सर होता है, तो हमें क्लाइंट साइड पर कमांड्स और रिसोर्सेस के बीच मैप करना होगा और फिर एपीआई साइड पर वापस आना होगा।
प्रशन:
- क्या इस सारी जटिलता को सिर्फ (मोटी) रीस्ट-टू-एप्स सर्विस मैपिंग लेयर द्वारा संभाला जाना चाहिए?
- या मुझे DDD / REST की मेरी समझ में कुछ याद आ रहा है?
- जटिलता के एक निश्चित (काफी कम) से अधिक डोमेन मॉडल की कार्यक्षमता को उजागर करने के लिए REST केवल व्यावहारिक नहीं हो सकता है?