2014-12-01 18 views
5

के साथ डीबीसीएन्टेक्स्ट का उपयोग करने की रैमिकेशन मैं अभी भी एक एएसपी.नेट एमवीसी एप्लीकेशन में अपने डीबीसीएन्टेक्स्ट को प्रबंधित करने के लिए निर्भरता इंजेक्शन का उपयोग करने के लिए नया हूं।निर्भरता इंजेक्शन

मैं लेख Managing Entity Framework DbContext Lifetime in ASP.NET MVC में उल्लिखित दृष्टिकोण का पालन करने का प्रयास कर रहा हूं। असल में, यह दृष्टिकोण निनजेक्ट और निर्भरता इंजेक्शन का उपयोग करने और मेरे नियंत्रकों में कन्स्ट्रक्टर के पैरामीटर के रूप में अपना डीबीसीएन्टेक्स्ट जोड़ने के लिए कहता है।

आगे, मैं इसे मूल नियंत्रक में कार्यान्वित कर रहा हूं, या जो मेरे सभी नियंत्रक वर्ग प्राप्त किए जाएंगे।

यह काम कर रहा है, लेकिन मैं निम्नलिखित मुद्दों पर हमला कर रहा हूं।

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

  2. यह मुझे मेरे सभी नियंत्रक वर्गों के लिए एक डीबीसीएन्टेक्स्ट देता है। लेकिन मेरे मॉडल में अन्य वर्गों के बारे में क्या है जिन्हें डीबीसीएन्टेक्स्ट की आवश्यकता है? क्या मुझे इन सभी कक्षाओं में डीबीसीएन्टेक्स्ट को उदाहरण को मैन्युअल रूप से पास करने की आवश्यकता है? या डीबीसीएन्टेक्स्ट की अपनी प्रति प्राप्त करने के लिए इन कक्षाओं में से प्रत्येक के लिए DI का उपयोग करने का कोई तरीका है?

+0

बदबू आ रही है। मेरे नियंत्रकों को ईएफ (या सामान्य रूप से डेटा एक्सेस) से पतले और अच्छी तरह से दूर रखने की तरह। मैं एक और परत जोड़ूंगा जो ईएफ के बारे में जानता है और पीओसीओ मॉडल को आपके नियंत्रकों या किसी और चीज को वापस कर सकता है जो उन्हें चाहिए। आवश्यकतानुसार इस परत से कक्षाओं को अलग-अलग नियंत्रकों में इंजेक्ट कर सकते हैं। – dbugger

+0

मैं आपके इनपुट की सराहना करता हूं, लेकिन ऐसा लगता है कि मैं जो कुछ पढ़ रहा हूं उससे काउंटर चलाता है। –

+2

आपने वास्तव में दृष्टिकोण को लागू करने के बाद इन मुद्दों को पोस्ट किया है, जिसका अर्थ है कि आप जो कुछ भी पढ़ चुके हैं उस पर बेचा नहीं जाता है, क्योंकि यह सही नहीं लगता है। बस सोचा कि मैं आपकी चिंताओं को मान्य करूंगा। – dbugger

उत्तर

6

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

यह दृष्टिकोण (भारी नियंत्रक) में से एक है जिसे आप अपने आवेदन में ईएफ का उपयोग करना चुन सकते हैं, आईएमओ यह सबसे साफ दृष्टिकोण नहीं है। और आपने सही ढंग से अपने आप को कम किया है।

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

यह ओपन क्लोज सिद्धांत भी तोड़ता है क्योंकि हर बार जब आप इनपुट पैरामीटर बदलते हैं तो आपको रचनाकारों को बदलने की आवश्यकता होती है।

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

जहां तक ​​निर्भरता इंजेक्शन का लक्ष्य है, लक्ष्य में से एक है, जहां निर्भरता को सीधे इंजेक्ट करना है।यदि आपके पास एक मॉडल क्लास है जिसे डीबीकॉन्टेक्स्ट की आवश्यकता है, तो आपको इसे अपने मॉडल क्लास कन्स्ट्रक्टर में डालना चाहिए (अधिकांश डी फ्रेमवर्क सपोर्ट प्रॉपर्टी इंजेक्शन के साथ-साथ कन्स्ट्रक्टर पसंदीदा दृष्टिकोण बना रहता है)।

डी फ्रेमवर्क के साथ, आप निर्भरताओं को एक स्थान (एप्लिकेशन प्रारंभिक कोड) पर कॉन्फ़िगर करेंगे और फिर प्रत्येक वर्ग जिसे निर्भरता की आवश्यकता है केवल इसे निर्माता में स्वीकार करें।

DI कंटेनर की तुलना उस शब्दकोश से की जा सकती है जहां कुंजी इंटरफ़ेस है और मान एक पका हुआ ऑब्जेक्ट है। एक बार सेटअप करने के बाद, आप कभी भी अपने आवेदन के माध्यम से सही कुंजी का उपयोग कर किसी ऑब्जेक्ट के लिए पूछ सकते हैं।

या डीबीसीएन्टेक्स्ट की अपनी प्रतिलिपि प्राप्त करने के लिए इन कक्षाओं में से प्रत्येक के लिए DI का उपयोग करने का कोई तरीका है?

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

वैकल्पिक समाधान:

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

आईडीटाकॉन्टेक्स्ट के पीछे डीबीकॉन्टेक्स्ट को समेकित किया है, तो मैं अपने परीक्षण या कल में एक स्टब डेटा संदर्भ सेट कर सकता हूं अगर मैं ईएफ से एनएचबीरनेट या कुछ और स्मार्ट डि फ्रेमवर्क में स्विच करना चाहता हूं, तो मुझे केवल आईडीटा कॉन्टेक्स्ट को लागू करना होगा और निर्भरता को बदलना होगा प्रारंभिक कोड

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

+1

यह अच्छा लगता है, हालांकि, आप IDTAContext के लिए अपना DI कंटेनर (बूटस्ट्रैपर) कहां सेट अप करते हैं? आपकी सेवा परत में? हम स्पष्ट रूप से यूआई परत में ऐसा नहीं कर सकते क्योंकि इसे डेटालियर के संदर्भ की आवश्यकता होगी। यदि ऐसा है, तो क्या आपके पास सेवा परत और UI परत के लिए एक अलग बूटस्ट्रैपर है? – crunchy

+0

मैं इसे UI परत में सेट करता हूं, जागरूक रूप से, क्योंकि यह Entities.dll को EntityFramework का संदर्भ नहीं है। Entities.dll संदर्भ ईएफ आंतरिक रूप से। जब तक यूआई परत नहीं जानता कि डेटा लेयर कैसे काम करता है (यानी ओआरएम का क्या उपयोग किया जा रहा है), एक संदर्भ जोड़ना ठीक आईएमओ है। – SBirthare

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