आर्किटेक्चरली बोलना, क्या एक डेटाबेस एब्स्ट्रैक्शन लेयर, जैसे कि Microsoft की एंटिटी फ्रेमवर्क, एक अलग डेटा एक्सेस लेयर की आवश्यकता को शून्य करती है?


11

यह वही रास्ता था

वर्षों से, मैंने अपने सॉफ़्टवेयर समाधानों को इस तरह व्यवस्थित किया है:

  • डेटा एक्सेस लेयर (DAL) डेटा एक्सेस करने के व्यवसाय को अमूर्त करने के लिए
  • व्यावसायिक तर्क परत (BLL) डेटा सेट, प्रमाणीकरण को संभालने आदि के लिए व्यावसायिक नियम लागू करने के लिए
  • उपयोगिताएँ (Util) जो कि सामान्य उपयोगिता विधियों का एक पुस्तकालय है जिसे मैंने समय के साथ बनाया है।
  • प्रेजेंटेशन लेयर जो कि वेब, डेस्कटॉप, मोबाइल, जो भी हो।

जिस तरह से अब है

पिछले चार वर्षों से या तो मैं माइक्रोसॉफ्ट के एंटिटी फ्रेमवर्क का उपयोग कर रहा हूं (मैं मुख्य रूप से एक .NET देव हूं) और मुझे पता चल रहा है कि डीएएल इस तथ्य के कारण साफ से अधिक बोझिल हो रहा है कि एंटिटी फ्रेमवर्क पहले ही कर चुका है। मेरा DAL जो काम करता था: यह एक डेटाबेस के खिलाफ CRUDs चलाने के व्यवसाय को रोकता है।

इसलिए, मैं आम तौर पर एक डीएएल के साथ समाप्त होता हूं जिसमें इस तरह की विधियों का एक संग्रह होता है:

public static IQueryable<SomeObject> GetObjects(){
    var db = new myDatabaseContext();
    return db.SomeObjectTable;
}

फिर, BLL में, इस विधि का उपयोग इस प्रकार किया जाता है:

public static List<SomeObject> GetMyObjects(int myId){
    return DAL.GetObjects.Where(ob => op.accountId == myId).ToList();
}

यह निश्चित रूप से एक सरल उदाहरण है क्योंकि बीएलएल में आमतौर पर तर्क की कई और पंक्तियां लागू होती हैं, लेकिन इस तरह के सीमित दायरे के लिए डीएएल को बनाए रखना थोड़ा अधिक लगता है।

क्या केवल डीएएल को छोड़ना बेहतर नहीं होगा और केवल मेरे बीएलएल तरीके लिखें:

public static List<SomeObject> GetMyObjects(int myId){
    var db = new myDatabaseContext();
    return db.SomeObjectTable.Where(ob => op.accountId == myId).ToList();
}

मैं ऊपर बताए गए कारणों से भविष्य की परियोजनाओं से डीएएल को छोड़ने पर विचार कर रहा हूं, लेकिन ऐसा करने से पहले, मैं एक परियोजना पर सड़क से नीचे उतरने से पहले आपकी बाधा / दूरदर्शिता / राय के लिए समुदाय को यहाँ पर चुनाव करना चाहता था और मुझे एक समस्या का पता चला ' टी प्रत्याशित

किसी भी विचार की सराहना की है।

अपडेट करें

सर्वसम्मति से ऐसा प्रतीत होता है कि एक अलग डीएएल आवश्यक नहीं है, लेकिन विक्रेता के लॉक इन से बचने के लिए यह एक अच्छा विचार है। उदाहरण के लिए, अगर मेरे पास एक डीएएल है जो ईएफ कॉल को अलग कर रहा है जैसा कि ऊपर सचित्र है, अगर मैं। कभी किसी अन्य विक्रेता के लिए स्विच करें मुझे अपने बीएलएल को फिर से लिखने की आवश्यकता नहीं है। डीएएल में केवल उन बुनियादी प्रश्नों को फिर से लिखना होगा। ऐसा कहने के बाद, मुझे ऐसा परिदृश्य देखना कठिन हो रहा है जिसमें ऐसा होगा। मैं पहले से ही एक Oracle db का EF मॉडल बना सकता हूँ, MSSQL एक दिया गया है, मुझे पूरा यकीन है कि MySql भी संभव है (??) इसलिए मुझे यकीन नहीं है कि अतिरिक्त कोड कभी सार्थक आरओआई प्रदान करेगा।


3
EF से आपकी डेटा एक्सेस लेयर अलग कैसे है? क्या EF डेटा एक्सेस लेयर नहीं है? केवल वही कारण जो मैं आपके व्यवसाय तर्क और ईएफ के बीच अपने स्वयं के अमूर्त रखने के लिए देख सकता हूं, परीक्षण के लिए स्टबिंग को आसान बनाना और विक्रेता लॉक से बचने के लिए है।
मार्जन वेनेमा

2
यह मेरी बात है - मेरे विचार में कोई अंतर नहीं है, लेकिन मैं काउंटर पॉइंट की तलाश कर रहा हूं। धन्यवाद।
मैट Cashatt

3
व्यक्तिगत रूप से मुझे एक अलग डीएएल बनाने का कोई कारण नहीं दिखता है, क्योंकि ईएफ / एनएचबेरनेट स्वयं में डेटा एक्सेस लेयर हैं। जैसा कि मार्जन ने उल्लेख किया है, EF के साथ आप इस पर विचार कर सकते हैं कि क्या आप डेटाबेस विक्रेता को बदलते हुए देख सकते हैं, NHibernate में आप कोड की एक पंक्ति (यहां तक ​​कि स्मृति परीक्षण के लिए SQLite ड्राइवर) में ड्राइवरों को स्वैप कर सकते हैं, इसलिए यह (IMO) अनावश्यक कोड होगा।
पेट्रीक 23wiek

3
दो DALs की आवश्यकता नहीं है। जैसा कि दूसरों ने कहा है, अपने बीएलएल को रखें, लेकिन अपने बीएलएल को विक्रेता के विशिष्ट निर्माणों में बंद करने से बचें। मैं हमेशा यह देखना पसंद करता हूं कि चीजें स्ट्रिंग या पूर्णांक स्तर तक नीचे आती हैं। तब मुझे पता है कि मैं वेब सेवाओं, सीरियल पोर्ट, टेलीग्राफ लिंक, बस मजाक कर रहा है जैसे बहुत ही आदिम चैनल पर पूरे बीएलएल / डीएएल जंक्शन को आसानी से उजागर कर सकता हूं।
एंडिज स्मिथ

1
फिर से अपडेट करें: यह अतिरिक्त परत बसिंसलेयर के यूनीटेस्ट को बहुत आसान बना सकती है क्योंकि मॉकिंग / स्टबिंग / फेकिंग की तुलना में मॉकिंग / स्टबिंग / फेकिंग आसान GetMyObjects(int myId)है GetObjects.Where(ob => op.accountId == myId).ToList()
k3b

जवाबों:


6

यकीन नहीं है कि अगर यह जवाब आप के लिए देख रहे हैं .. लेकिन यहाँ जाता है।

हम इसे चीजों को अलग / व्यवस्थित रखने के लिए करते हैं। हां, EF / NHibernate डेटा एक्सेस है .. लेकिन हम इसके उपयोग को एक सामान्य रिपॉजिटरी सेटअप के साथ अपनी विधानसभा तक सीमित करते हैं। इस असेंबली में हमारे सभी NHibernate मैपिंग, सत्र कारखाने, कई डेटाबेस को संभालने के लिए कोड आदि शामिल हैं।

हम अभी भी इसे "डेटा एक्सेस लेयर" के रूप में संदर्भित करते हैं, क्योंकि पूरी विधानसभा हमारे ओआरएम का समर्थन करने के लिए मौजूद है।

मुझे शायद ध्यान देना चाहिए कि हमारे मुख्य ऐप में 5 डेटाबेस का संदर्भ है, लगभग 4-500 डोमेन ऑब्जेक्ट / मैपिंग और विभिन्न स्कीमा हैं। इसलिए, यह सेटअप हमारे लिए महत्वपूर्ण है। शायद एक छोटे से ऐप के लिए आप इस असेंबली को छोड़ देंगे लेकिन .. मैं संगठित कोड के लिए एक चूसने वाला हूं और शायद वैसे भी यह करूंगा :)


2

मैं ईएफ और डीएएल को एक एंटरप्राइज सिस्टम में अलग-अलग घटकों के रूप में देखता हूं। डेटा एक्सेस लेयर एक एब्सट्रैक्शन है जो अन्य सेवाओं का उपयोग डेटा दृढ़ता और प्रबंधन करने के लिए करता है। आमतौर पर एंटिटी फ्रेमवर्क कोर के आसपास क्वेरी, अपडेट, डिलीट और इंसर्ट करने के लिए एक अच्छा एपीआई बनाते हैं, लेकिन फिर भी उन्हें बैक-एंड डेटा स्रोत से सीधे कनेक्शन की आवश्यकता होती है। इसलिए किसी भी प्रकार का रूटिंग या फायरवॉल ईएफ को काम करने से रोक देगा, इस प्रकार आपको ईएफ मध्यस्थता घटक बनाने की आवश्यकता होती है।

यहां एक उच्च-स्तरीय उदाहरण दिखाया गया है, जहां DAL और EF फिट हैं:

-------------    -------                                    ----------------    ------
| Service A | -> | DAL | -> { LOCAL / LAN / WAN ACCESS } -> | DAL BACK-END | -> | EF |
-------------    -------                                    ----------------    ------

यह मेरा अनुभव रहा है कि एक बेहतर डिज़ाइन व्यवसाय तर्क या सेवा कार्यान्वयन को कभी भी EF परत तक सीधी पहुँच की अनुमति नहीं देता है। इसके बजाय, सभी निरंतर डेटा के साथ काम करने के लिए एक अमूर्तता प्रदान करने के लिए जो आपको तार पर अनुरोधों को शिप करने या उन्हें स्थानीय रूप से निष्पादित करने की अनुमति देता है।

यह डिजाइन हालांकि कुछ टपका हुआ अमूर्तता का परिचय देता है। इसलिए इसे केस के आधार पर विचार किया जाना चाहिए।

कुछ सवाल पूछने के लिए:

  • क्या आपके डेटा तक पहुँचने वाले सभी घटक बैक-एंड डेटा स्टोर से कनेक्शन प्राप्त करने में सक्षम होंगे?
  • क्या आपका EF आपको विभिन्न प्रकार के डेटा स्टोरों पर डेटा सेट को एकत्रित करने की अनुमति देता है? उदाहरण के लिए दस्तावेज़ों के लिए MongoDB के साथ एक SQL डेटाबेस का उपयोग करना।

1

आजकल सवाल यह है कि आप डेटा स्टोरेज को बदलने जा रहे हैं या नहीं, यह पहले की तुलना में अधिक दिलचस्प है, क्योंकि यह सवाल सिर्फ एमएस SQL ​​या ओरेकल एसक्यूएल के बीच स्वैप नहीं होगा या नहीं, लेकिन यह बड़ा सवाल है कि क्या आप आपके डेटा भंडार के रूप में विभिन्न NoSQL डेटा भंडारण प्रसाद पर उपयोग कर सकते हैं।

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

इसी तरह, एक डीएएल के भीतर ईएफ शायद आपके बीएलएल कोड यूनिट परीक्षणों के लिए डेटा एक्सेस का मजाक उड़ाएगा।

इसलिए मेरा विचार है कि EF (या अन्य ORMS) डेटा एक्सेस लेयर की आवश्यकता को शून्य नहीं करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.