8

इस सरल, समेकित उदाहरण को लें:रिपोजिटरी, सेवा या डोमेन ऑब्जेक्ट - तर्क कहां से संबंधित है?

UserRepository.GetAllUsers(); UserRepository.GetUserById();

//returns users where active=true, deleted=false, and confirmed = true 
GetActiveUsers(); 

मैं मुसीबत का निर्धारण जहां भंडार की जिम्मेदारी समाप्त हो जाती है आ रही हैं:

अपरिहार्य रूप से मैं इस तरह के रूप में और अधिक जटिल "क्वेरी", होगा। GetActiveUsers() एक साधारण "क्वेरी" का प्रतिनिधित्व करता है। क्या यह भंडार में है?

कैसे कुछ, जैसे कि तर्क का एक सा शामिल है के बारे में:

//activate the user, set the activationCode to "used", etc. 
ActivateUser(string activationCode); 

उत्तर

3

रिपोजिटरीज ऑब्जेक्ट्स के अनुप्रयोग-विशिष्ट हैंडलिंग के लिए ज़िम्मेदार हैं। यह स्वाभाविक रूप से प्रश्नों के साथ-साथ संशोधनों को सेट करता है (सम्मिलित/हटाएं)।

ActivateUser एक ही ऑब्जेक्ट पर चल रहा है। उस ऑब्जेक्ट को पुनर्प्राप्त करने की आवश्यकता है, फिर संशोधित किया जाना चाहिए। रिपॉजिटरी सेट से ऑब्जेक्ट को पुनर्प्राप्त करने के लिए ज़िम्मेदार है; एक और वर्ग क्वेरी का आह्वान करने और वस्तु का उपयोग करने के लिए जिम्मेदार होगा।

2

इन सभी उत्कृष्ट सवाल पूछ होने के लिए कर रहे हैं। यह निर्धारित करने में सक्षम होना कि आप इनमें से किस का उपयोग करना चाहिए, उस अनुभव और समस्या पर निर्भर करता है जिस पर आप काम कर रहे हैं।

मैं फोउलर के patterns of enterprise architecture जैसी पुस्तक पढ़ने का सुझाव दूंगा। इस पुस्तक में उन्होंने आपके द्वारा वर्णित पैटर्न पर चर्चा की। सबसे महत्वपूर्ण बात यह है कि वह प्रत्येक पैटर्न को जिम्मेदारी असाइन करता है। उदाहरण के लिए डोमेन तर्क या तो सेवा या डोमेन परतों में रखा जा सकता है। प्रत्येक के साथ जुड़े पेशेवर और विपक्ष हैं।

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

मुझे लगता है कि GetAtcitveUsers रिपोजिटरी के लिए ठीक है। आप डेटाबेस से सभी उपयोगकर्ताओं को पुनर्प्राप्त नहीं करना चाहते हैं और यह पता लगाने के लिए कि एप्लिकेशन में कौन से सक्रिय हैं, इससे खराब प्रदर्शन होगा। यदि आपके द्वारा सुझाए गए ActiveateUser के पास व्यावसायिक तर्क है, तो वह तर्क डोमेन ऑब्जेक्ट में संबंधित है। परिवर्तन को कायम रखना रिपोजिटरी परत की ज़िम्मेदारी है।

उम्मीद है कि इससे मदद मिलती है।

+0

आपके अंतिम पैराग्राफ के जवाब में: यदि "परिवर्तन जारी रखना" एकमात्र तर्क है तो क्या होगा। जैसे ActivateUser() उपयोगकर्ता तालिका में केवल एक रिकॉर्ड और सक्रियण कोड तालिका में एक रिकॉर्ड अपडेट करता है। क्या यह "तर्क" का गठन करता है? यदि नहीं, तो क्या करता है? – betitall

2

डीडीडी परियोजनाओं का निर्माण करते समय मुझे दो जिम्मेदारियों को अलग करना पसंद है: एक रिपोजिटरी और एक खोजक।

एक रिपोजिटरी कुल जड़ों को संग्रहित करने और उन्हें पुनर्प्राप्त करने के लिए ज़िम्मेदार है, लेकिन केवल कमांड प्रसंस्करण में उपयोग के लिए। कमांड प्रसंस्करण द्वारा मेरा मतलब है कि किसी उपयोगकर्ता द्वारा किए गए किसी भी क्रिया को निष्पादित करना।

एक खोजक UI के उद्देश्यों के लिए डोमेन ऑब्जेक्ट्स पूछने के लिए ज़िम्मेदार है, जैसे ग्रिड दृश्य और विवरण दृश्य।

मैं खोजकर्ताओं को डोमेन मॉडल का हिस्सा नहीं मानता।विशेष IXxxFinder इंटरफेस प्रस्तुति परत में रखा गया है, डोमेन परत में नहीं। IXxxRepository और IXxxFinder दोनों का कार्यान्वयन डेटा एक्सेस लेयर में संभवतः एक ही कक्षा में भी रखा जाता है।

संबंधित मुद्दे