मैं डीडीडी अवधारणाओं के आस-पास डोमेन के साथ मानक वेब एप्लिकेशन पर काम करता हूं। मैं सोच रहा हूं कि मेरी एप्लिकेशन सेवाओं को किस तरह की वस्तुओं को स्वीकार करना चाहिए और वापस जाना चाहिए। मान लें कि मेरे पास User
कुल के लिए एक एप्लिकेशन सेवा है।आवेदन सेवा पैरामीटर/वापसी प्रकार
1) DTOs/सरल प्रकार (स्ट्रिंग, पूर्णांक आदि)
public interface UserApplicationService {
void registerUser(UserDTO userDTO);
List<UserDTO> getUsersForOrganization(String organizationId);
}
इस मामले में, आवेदन सेवा डोमेन वस्तुओं और इसका विपरीत कोडांतरक बदलने DTOs फोन करने के लिए जिम्मेदार है।
इस दृष्टिकोण का लाभ यह है कि मेरी एप्लिकेशन सेवा मेरे डोमेन ऑब्जेक्ट्स के लिए एक स्पष्ट सीमा है। दूसरा यह है कि आवेदन सेवा एक स्पष्ट लेनदेन सीमा है। दृढ़ता संदर्भ द्वारा प्रबंधित डोमेन ऑब्जेक्ट्स लेनदेन के बाहर कहीं भी रिसाव नहीं करते हैं।
नुकसान यह है कि फॉर्मों के मामले में, सत्यापन डीटीओ पर आधारित होना चाहिए। इसलिए मेरे सत्यापन नियम डोमेन के बीच डुप्लिकेट किए गए हैं (ऑब्जेक्ट इसके राज्य के लिए ज़िम्मेदार है) और डीटीओ सत्यापन नियम। (Spring MVC sample application के मामले में)। इसके अलावा, अगर कुछ हिस्सों को मॉडल के दूसरे रूप की आवश्यकता होती है (मान लीजिए कि उपयोगकर्ता डीटीओ के पास प्रस्तुत करने के लिए पर्याप्त जानकारी नहीं है), मुझे आवेदन सेवा से लौटाए गए कुछ डीटीओ पर एक और डीटीओ और आधार बनाना होगा, एक और लिखें , देखने के द्वारा प्रयोग किया जाता है।
2) डोमेन प्रकार
public interface UserApplicationService {
void registerUser(User user);
List<User> getUsersForOrganization(OrganizationId organizationId);
}
इस मामले में, नियंत्रक/प्रस्तोता परिवर्तन के लिए जिम्मेदार है।
बड़ा नुकसान यह है कि मेरे डोमेन ऑब्जेक्ट्स एप्लिकेशन सेवा से रिसाव - कोई स्पष्ट अलगाव नहीं। इसके अलावा, हमारी लेनदेन सीमाएं कहां हैं? डोमेन ऑब्जेक्ट्स जो कि संलग्न हो सकते हैं, उदाहरण के लिए हाइबरनेट सत्र, अनुप्रयोग सेवाओं परत के बाहर लीक। (हालांकि, मैंने देखा कि यह कितने नमूना अनुप्रयोग लिखे गए हैं।)
लाभ यह हो सकता है कि नियंत्रक/प्रस्तुतकर्ता मॉडल की तैयारी के लिए जिम्मेदार है, इसलिए यह दृश्य आवश्यकताओं पर डीटीओ आधार तैयार कर सकता है। उदाहरण के लिए, दृश्य को कुछ अतिरिक्त जानकारी की आवश्यकता हो सकती है जो #getUsersForOrganizationMethod से डीटीओ में वापस नहीं आती है। साथ ही, सत्यापन डोमेन ऑब्जेक्ट्स पर आधारित हो सकता है, इसलिए यह डीटीओ और डोमेन ऑब्जेक्ट्स के बीच डुप्लीकेट नहीं है।
3) डोमेन वस्तुओं + मुखौटा
यह तीसरा विकल्प DDDsample application में प्रयोग किया जाता है। एप्लिकेशन सेवाएं डोमेन प्रकार लौटाती हैं, लेकिन कुछ मुखौटा है जो परिवर्तन के लिए ज़िम्मेदार है। तो मेरे मामले में, नियंत्रक/प्रस्तुतकर्ता डीटीओ के साथ मुखौटा करने के लिए बातचीत करता है, मुखौटा परिवर्तन करता है और यह डोमेन ऑब्जेक्ट्स का उपयोग करके एप्लिकेशन सेवाओं के साथ बात करता है। हालांकि, मेरी विनम्र राय में यह थोड़ा जबरदस्त लगता है - बहुत सारी परतें, बहुत सारे बॉयलरप्लेट कोड। एक आवेदन सेवा के लिए यह बहुत अच्छा लग सकता है, लेकिन अगर हमारे पास दसियों थे, तो हमें समान संख्या में मुखौटा तरीकों की आवश्यकता होती है - शुद्ध नकल। इसके अतिरिक्त, लेनदेन सीमाएं कहां हैं?
अच्छा जवाब है, धन्यवाद! टिप्पणियों के युगल: 1) यदि आप आवेदन सेवाओं में VO स्वीकार करते हैं, क्या इस तरह के चेकआउट के रूप में आपरेशन के मामले में अपने पैरामीटर प्रकार हो सकता है? उत्पादों की जोड़ी आप चाहें तो एक विधि मंगलाचरण में पारित करने के लिए और आप सभी के लिए कुछ कुल करनी होंगी उन्हें-यहाँ DTOs IMHO आता है; मुझे लगता है कि फॉर्म बीन प्रस्तुति परत से संबंधित है और सेवा द्वारा स्वीकार नहीं किया जाना चाहिए। 2) आपकी लेनदेन सीमाएं कहां हैं? अगर हम सेवाओं से इकाइयों को वापस लौटते हैं तो यह नियंत्रक को इसे संशोधित करने की अनुमति देगा और संभावित रूप से कुछ अजीब मुद्दों का कारण बन जाएगा (विशेष रूप से यदि इकाई लेनदेन संबंधी प्रॉक्सी है)। –
@ woof-woof कुछ अपडेट्स और मुझे "चेकआउट" और "उत्पाद" नहीं मिलते हैं, क्या आप इसे थोड़ा और समझा सकते हैं? – Hippoom
मान लीजिए कि आपके पास एक दुकान एप्लिकेशन है और उपयोगकर्ता कुछ उत्पादों और उत्पादों को खरीदना चाहता है। इसलिए उपयोगकर्ता चेकआउट कर रहा है (यह मेरी समझ है :))। उपयोगकर्ता सभी या कुछ भी चेकआउट (खरीद) करना चाहता है - यही कारण है कि हमें कुल वस्तुओं और उनकी मात्रा में कुछ वस्तु की आवश्यकता होगी। –