क्या यह बुरा डिज़ाइन है? इसमें कैसे सुधार किया जा सकता है?


9

मैंने कुछ समय पहले निम्नलिखित लिखा था, लेकिन मैं हाल ही में इसकी समीक्षा करने आया हूं, और अब मुझे नहीं लगता कि यह अच्छा डिज़ाइन है।

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

इस प्रणाली में डेटाबेस के साथ सभी संपर्क संग्रहीत प्रक्रियाओं के माध्यम से है। डेटाबेस पर कॉल करने के लिए, क्वेरी विधि हस्ताक्षर इस तरह दिखता है:

List<TReturn> Query<TReturn>(string Context, 
                             string Procedure, 
                             TransactionScope Scope, 
                             List<ObjectParameter> QueryParameters)

यह मॉड्यूलरिटी मुझे पसंद है। हालांकि, इस दृष्टिकोण में एक महत्वपूर्ण कमी है: when using the database layer, the code using it has to have a reference to the library in which the context is stored, in order to access the types returned by the stored procedures through Entity Framework.मॉडल में, डेटाबेस लेयर से ऑब्जेक्ट्स को नए ऑब्जेक्ट्स में अनुवादित किया जाता है जिसे व्यू और कंट्रोलर उपयोग करते हैं।

मुझे लगता है कि यह खराब डिजाइन है, लेकिन मैं इसे कैसे सुधार सकता हूं? मैंने एक खाली इंटरफ़ेस को जोड़ने पर विचार किया है जैसे IStoredProecedureObjectकि संग्रहित प्रक्रिया द्वारा लौटाए गए प्रत्येक डेटा प्रकार को एक सामान्य आधार प्रकार दिया जाता है, हालांकि यह एंटोनियो फ्रेमवर्क द्वारा ठीक किया गया प्रतीत होता है। हर बार जब .edmxफ़ाइल को फिर से जोड़ा जाता है, तो कोड नए सिरे से बनाया जाता है, और किसी भी अतिरिक्त को हटा दिया जाता है। क्या ऐसा होने से रोकने का कोई तरीका है?

मैं इस डिज़ाइन को कैसे सुधार सकता हूं? क्या (और) इसके साथ गलत है? या मैं सही रास्ते पर हूँ?

जवाबों:


6

डिस्क्लेमर: मैं एंटिटी फ्रेमवर्क का उपयोग नहीं करता हूं और किसी भी डेटाबेस हेल्पर फ्रेमवर्क के बारे में बहुत अधिक पूर्वाग्रही हूं।

ऐसा लग रहा है कि आपने रैपर बना लिया है।

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

डेटाबेस एक्सेस के इंटरफ़ेस को सरल बनाने में समस्या यह है कि यह आमतौर पर सरल नहीं है। आप या तो ADO / JDBC / etc के इंटरफ़ेस को दोहराते हैं। या आप लोगों को इसे दरकिनार करने के लिए मजबूर करते हैं। रैपर सभी प्रकार की अवांछित चीजें करते हैं। जब आप लेन-देन का समर्थन करने के लिए इसे खोल सकते हैं तो वे स्वचालित रूप से एक कनेक्शन बंद कर सकते हैं। यदि आप डेटा को स्ट्रीम करना चाहते थे, तो वे अक्सर गलत तरीके से कनेक्शन छोड़ देते हैं, और उन कचरा एकत्र भाषाओं में से एक का उपयोग कर रहे हैं। अपने रैपर के पीछे पुस्तकालय की पूरी शक्ति देने के लिए आपको इसे डुप्लिकेट करने के लिए मजबूर किया जाता है।

ADO / JDBC जैसी लाइब्रेरी पहले से ही एक ग्रेट इंटरफ़ेस हैं। वे सही किए गए OOP के कुछ बेहतरीन उदाहरण हैं। मैं एक रैपर के ऊपर उनका इस्तेमाल करना पसंद करूंगा, जो कुछ हैज़बंग ने अपनी टोपी से निकाली थी।

क्लासिक JDBC / ADO शैली इंटरफ़ेस अच्छी तरह से जाना जाता है और समझा जाता है। आपकी टोपी से खींचा हुआ रैपर नहीं है।

निरर्थक "paramters.Add" को कम करना चाहते हैं? जेनरिक में देखें। या बस स्वीकार करें कि "paramter.Add" को कम करने की कोशिश करके आप वास्तव में ".add" को कोड की दूसरी परत पर धकेल देते हैं।

BTW यह एक बड़ा सवाल है। अगर मैं कर सकता तो मैं इसे 10 गुना बढ़ा देता।

संपादित करें: बेशक JDBC कोड डेटा एक्सेस लेयर में छिपा होगा।


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

आपके EF पूर्वाग्रह के बावजूद महान सामग्री के लिए +1 ... हालाँकि EF DB सहायक ढांचे से अधिक है। आप इसके लिए एक रैपर बनाने की कोशिश कर रहे हैं।
सोय्लेंटग्रे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.