पृष्ठभूमि:
मैं एक सर्वर एप्लिकेशन डिज़ाइन कर रहा हूं और अलग-अलग सबसिस्टम के लिए अलग dll बना रहा हूं। चीजों को सरल बनाने के लिए, मान लें कि मेरे पास दो सबसिस्टम हैं: 1) Users2)Projects
उपयोगकर्ताओं के सार्वजनिक इंटरफ़ेस में एक विधि है:
IEnumerable<User> GetUser(int id);
और परियोजनाओं के सार्वजनिक इंटरफ़ेस की एक विधि है:
IEnumerable<User> GetProjectUsers(int projectId);
इसलिए, उदाहरण के लिए, जब हमें एक निश्चित परियोजना के लिए उपयोगकर्ताओं को प्रदर्शित करने की आवश्यकता होती है, तो हम कॉल कर सकते हैं GetProjectUsersऔर यह डेटाट्रेड्रिड या समान में दिखाने के लिए पर्याप्त जानकारी के साथ ऑब्जेक्ट वापस देगा।
समस्या:
आदर्श रूप से, Projectsसबसिस्टम को उपयोगकर्ता की जानकारी को संग्रहीत नहीं करना चाहिए और इसे केवल एक परियोजना में भाग लेने वाले उपयोगकर्ताओं के Ids को संग्रहीत करना चाहिए। प्रस्तुत करने के लिए GetProjectUsers, इसे कहते हैं की जरूरत GetUserके Usersप्रत्येक उपयोगकर्ता आईडी अपने स्वयं के डेटाबेस में संग्रहीत के लिए प्रणाली। हालाँकि, इसके लिए अलग-अलग GetUserकॉल की बहुत आवश्यकता होती है , जिससे Userसबसिस्टम के अंदर अलग-अलग अलग-अलग sql क्वेरी होती हैं । मैंने वास्तव में इसका परीक्षण नहीं किया है लेकिन इस गंदी डिजाइन के होने से प्रणाली की स्थिरता प्रभावित होगी।
अगर मैं सबसिस्टम के पृथक्करण को अलग रख देता हूं, तो मैं सभी जानकारी को एक ही स्कीमा में स्टोर कर सकता हूं, जो दोनों प्रणालियों द्वारा सुलभ Projectsहो और JOINसभी प्रोजेक्ट उपयोगकर्ताओं को एक ही क्वेरी में प्राप्त करने के लिए कर सकता है । Projectsयह भी जानना होगा कि Userक्वेरी परिणामों से ऑब्जेक्ट कैसे उत्पन्न करें। लेकिन इससे अलगाव टूट जाता है जिसके कई फायदे हैं।
प्रश्न:
क्या कोई व्यक्ति इन सभी व्यक्तिगत GetUserकॉल से बचने के दौरान अलगाव को बनाए रखने का एक तरीका सुझा सकता है GetProjectUsers?
उदाहरण के लिए, मुझे लगता है कि मेरे पास एक उपयोगकर्ता था जो बाहरी प्रणालियों को एक लेबल-मूल्य जोड़ी के साथ उपयोगकर्ताओं को "टैग" करने की क्षमता देता था, और उपयोगकर्ताओं को एक निश्चित मूल्य के साथ अनुरोध करने के लिए, जैसे:
void AddUserTag(int userId, string tag, string value);
IEnumerable<User> GetUsersByTag(string tag, string value);
तब प्रोजेक्ट सिस्टम प्रत्येक उपयोगकर्ता को टैग कर सकता है क्योंकि वे प्रोजेक्ट में जोड़े जाते हैं:
AddUserTag(userId,"project id", myProjectId.ToString());
और GetProjectUsers के दौरान, यह एक ही कॉल में सभी परियोजना उपयोगकर्ताओं से अनुरोध कर सकता है:
var projectUsers = usersService.GetUsersByTag("project id", myProjectId.ToString());
मैं इस बारे में निश्चित नहीं हूं: हां, उपयोगकर्ता परियोजनाओं के अज्ञेय हैं, लेकिन वास्तव में परियोजना सदस्यता के बारे में जानकारी उपयोगकर्ता प्रणाली में संग्रहीत की जाती है, परियोजनाएं नहीं। मुझे बस स्वाभाविक नहीं लगता है इसलिए मैं यह निर्धारित करने की कोशिश कर रहा हूं कि क्या यहां एक बड़ा नुकसान है जो मुझे याद आ रहा है।