एंटिटी फ्रेमवर्क और लेयर सेपरेशन


12

मैं एंटिटी फ्रेमवर्क के साथ थोड़ा काम करने की कोशिश कर रहा हूं और मुझे परतों के अलगाव के बारे में एक सवाल मिला है।

मैं आमतौर पर UI -> BLL -> DAL दृष्टिकोण का उपयोग करता हूं और सोच रहा हूं कि यहां ईएफ का उपयोग कैसे किया जाए।

मेरी दाल आमतौर पर कुछ इस तरह होगी

GetPerson(id)
{
    // some sql
    return new Person(...)
}

BLL:

GetPerson(id)
{
    Return personDL.GetPerson(id)
}

यूआई:

Person p = personBL.GetPerson(id)

मेरा सवाल अब यह है: चूँकि EF मेरा मॉडल और DAL बनाता है, क्या EF को अपने DAL के अंदर लपेटना एक अच्छा विचार है या यह सिर्फ समय की बर्बादी है?

अगर मुझे EF को लपेटने की आवश्यकता नहीं है, तो मैं अभी भी अपने Model.esmx को अपनी कक्षा की लाइब्रेरी के अंदर रखूँगा या क्या यह ठीक रहेगा कि इसे अपने BLL के अंदर रखूँ और वहाँ कुछ काम करूँ?

मैं वास्तव में EF को अपने DAL के अंदर लपेटने का कारण नहीं देख सकता, लेकिन मैं यह जानना चाहता हूं कि अन्य लोग क्या कर रहे हैं।

इसलिए उपर्युक्त होने के बजाय, मैं DAL को छोड़ दूंगा और बस करूंगा:

BLL:

GetPerson(id)
{
    using (TestEntities context = new TestEntities())
    {
            var result = from p in context.Persons.Where(p => p.Id = id)            
                    select p;
    }
}

क्या करें?

जवाबों:


13

आपके द्वारा प्रदान किया गया उदाहरण शायद ही स्तरित वास्तुकला है। मुझे पता है कि यह जानबूझकर सरल है, लेकिन:

आपकी प्रस्तुति परत सीधे व्यक्ति इकाई से जुड़ी हुई है। यह केवल सबसे सरल मामलों में ठीक है, और निश्चित रूप से नहीं जब आप अपनी परतों को परिभाषित करने की कोशिश कर रहे हों।

गेटपर्सन विधि प्रत्येक कॉल के लिए एक नया संदर्भ बनाने के बजाय एक बुरा अभ्यास का उपयोग कर रही है। आपको कंस्ट्रक्टर में संदर्भ प्राप्त करना चाहिए, और यह आपके आईओसी कंटेनर द्वारा प्रदान किया जाएगा।

एक सरल, अभी तक प्रभावी संरचना जिसका मैंने उपयोग किया है:

  • Project.Core - इसमें दृश्य मॉडल और इंटरफ़ेस शामिल हैं।
  • Project.DAL - मेरे EDMX और उत्पन्न कोड के साथ।
  • प्रोजेक्ट.बीएलएल - व्यावसायिक तर्क।
  • Project.Web - स्वयं वेब ऐप।

यह ध्यान रखने के लिए महत्वपूर्ण है:

  • कोर किसी अन्य समाधान पर निर्भर नहीं है।
  • डीएएल किसी अन्य समाधान पर निर्भर नहीं है।
  • Project.Web कोर पर निर्भर करता है, लेकिन DAL और BLL पर नहीं।
  • बीएलएल कोर और डीएएल पर निर्भर करता है।

1
कोर एक व्यापार वस्तु परत प्रतीत होगा।
sq33G

यह बहुत ज्यादा है जो मैं भी उपयोग करता हूं, हालांकि, मैं इंटरफ़ेस घोषणाओं को पूरा करने के लिए अतिरिक्त DLL जोड़ूंगा। इस तरह से आप केवल इंटरफेस का संदर्भ देते हैं (और DI के लिए [url = unity.codeplex.com/atalogUnity [/url ] जैसी किसी चीज़ का उपयोग करते हैं ) और आप यह सुनिश्चित कर सकते हैं कि आपके द्वारा आकस्मिक रूप से प्रेरित कोई अजीब निर्भरता नहीं है।
एड जेम्स

आम तौर पर, ईएफ के बिना मैं एक "मॉडल" परत में अपना खुद का व्यक्ति वर्ग बनाता हूं, इसलिए मेरे पास यूआई, बीएलएल, डीएएल और मॉडल है: यूआई बीएलएल और मॉडल जानता है। बीएलएल डीएएल और मॉडल को जानता है। DLL जानता है मॉडल। क्या आप अपने स्वयं के "व्यू मॉडल" को अस्वस्थ बनाते हैं और ईएफ जेनरेट का उपयोग क्यों नहीं करते? (मुझे पता है कि यह स्तरित वास्तुकला के खिलाफ जाता है, लेकिन आप वास्तव में डेटा प्राप्त करने के तरीके को कितनी बार स्विच करते हैं?)
थॉमस

@ थोमा कुछ सार में दृश्य मॉडल लपेटकर इकाई परीक्षण को इतना आसान बना देगा।
sq33G

3
मॉडल! = मॉडल देखें
बोरिस यैंकोव

2

आपको किसी भी चीज़ में अपने ईडीएमएक्स को लपेटने की आवश्यकता नहीं है।

यदि आप EF से किसी अन्य दृष्टिकोण में बदलने की आवश्यकता की संभावना का अनुमान लगा सकते हैं, तो आप एक अलग व्यावसायिक वस्तु परत में परिभाषित इंटरफेस को लागू करने के लिए अपनी व्यावसायिक वस्तुओं (आंशिक वर्गों का लाभ उठाते हुए) का विस्तार करना चाह सकते हैं।

फिर अपने कोड से आप केवल उन इंटरफेस से निपटेंगे और कंक्रीट से उत्पन्न कक्षाओं के साथ नहीं। इसे एक साथ रखने के लिए थोड़ा गोंद कोड की आवश्यकता हो सकती है; EDMX के साथ आपका DAL हो सकता है।


इसलिए यदि EF से किसी अन्य दृष्टिकोण में कोई परिवर्तन नहीं किया जाता है, तो मेरा कोड ऊपर ठीक होगा? मैं तब केवल UI और BLL (जहाँ EDMX BLL में है) होगा?
थॉमस

मेरा व्यावहारिक जवाब हां होगा। इस चेतावनी के साथ कि आप वास्तव में ईडीएमएक्स को अपनी छोटी विधानसभा में रखना चाहते हैं यदि यह बड़ी और ज्यादातर स्थैतिक होगी, ताकि आपको इसे बार-बार पुन: व्यवस्थित / पुनर्वितरित करने की आवश्यकता न पड़े।
sq33G

आह, recompile / redistribute के बारे में अच्छी बात है :)
थॉमस

2

लेयरिंग के दो सामान्य दृष्टिकोण हैं: सख्त लेयरिंग और आराम से लेयरिंग।

एक कड़ाई से स्तरित दृष्टिकोण एक परत में घटकों को केवल साथियों के साथ और सीधे नीचे परत के साथ बातचीत करने के लिए विवश करता है।

एक आराम से स्तरित आवेदन बाधाओं को कम कर देता है जैसे कि एक घटक किसी भी निचली परत से घटकों के साथ बातचीत कर सकता है।

आराम से लेयरिंग का उपयोग करने से दक्षता में सुधार हो सकता है क्योंकि सिस्टम को एक परत से अगली तक सरल कॉल को अग्रेषित करने की आवश्यकता नहीं है। दूसरी ओर, आराम से लेयरिंग का उपयोग करने से परतों के बीच समान स्तर नहीं मिलता है और उच्च परतों को प्रभावित किए बिना निचली परत को स्वैप करना अधिक कठिन हो जाता है।

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

निष्कर्ष: यदि आपको मध्य परत को खोने की आवश्यकता नहीं है; सभी अनुप्रयोगों को एक ही दृष्टिकोण की आवश्यकता नहीं होती है और किसी तरह लेयरिंग उद्देश्य के लिए सिर्फ एक परत को जोड़ने से जटिलता लागत और रखरखाव पर जुर्माना होगा।

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