2011-07-22 18 views
22

निबर्ननेट + रिपोजिटरी पैटर्न के साथ लेने के लिए अनुशंसित दृष्टिकोण क्या है?एनएचबेर्नेट और रिपोजिटरी पैटर्न

इतने सारे अलग-अलग लेख और राय हैं कि मुझे यकीन नहीं है कि कौन सी पथ लेना है। उदाहरण के लिए Take this lengthy article। यह क्वेरी ऑब्जेक्ट का एक उदाहरण देता है, लेकिन प्रत्येक कंक्रीट रिपोजिटरी अपने कन्स्ट्रक्टर में ISession स्वीकार करता है। मुझे अपने बीएल (बिजनेस लेयर) में एनएच सत्रों के बारे में क्या ख्याल रखना चाहिए?

  1. खजाने का एक समूह बनाएं, उनमें से प्रत्येक के विशिष्ट विधियों का एक समूह हो रही है?
    जाहिर है, यह बहुत अधिक काम है क्योंकि बीएल अब एनएचबेर्नेट (Repository is the new Singleton) से अवगत होने की अनुमति है?

  2. एक भी सामान्य भंडार बनाएं, लेकिन IQueriable<T> बेनकाब और हर अब
    बीएल में LINQ का उपयोग करें और फिर वहाँ एक प्रश्न जो LINQ करने वाली NHibernate प्रोसेस करने में सक्षम नहीं होगा (या मैं बदलाव करने की जरूरत है एसक्यूएल मैन्युअल रूप से सौ प्रश्नों में एक बार)। यह कस्टम रेपो विधियों के साथ आसान है, लेकिन LINQ पर भरोसा कोड के साथ असंभव के बगल में। और दोनों का उपयोग सिर्फ इसलिए कि कुछ मामलों में LINQ टूट गया है बकवास है।

  3. क्वेरी ऑब्जेक्ट्स?
    QueryOver एनएच-विशिष्ट भी है, जिसका अर्थ है कि बीएल को फिर से डीएएल कार्यान्वयन के बारे में पता है।

  4. फिर भी एक और दृष्टिकोण?

जाहिर है, मैं (हालांकि वहाँ भी है कि के कई अलग अलग कार्यान्वयन के आसपास रहे हैं) शायद एक यूनिट के- काम पैटन का उपयोग कर लेनदेन कहीं प्रबंधन करने के लिए, सक्षम होना चाहिए।

+0

क्या आप डीडीडी में भंडार के बारे में बात कर रहे हैं? – mathieu

+0

@mathieu: हाँ। (मुझे यकीन नहीं है कि मैं कौन से अन्य भंडारों के बारे में सोच सकता हूं।) लेकिन अधिक आम तौर पर, मैं 2011 में लिखे गए एक ऐप को व्यवस्थित करने के लिए एक अनुशंसित तरीका ढूंढ रहा हूं, जिसमें सभी आधुनिक औजार और पैटर्न हैं। मैंने पहले कई तरीकों से एनएचबर्ननेट का उपयोग किया है, लेकिन मुझे नफरत है जब मुझे अपने बीएल में एनएच विशिष्ट वर्गों का संदर्भ देने की आवश्यकता है। और ऐसा लगता है कि यह कहना आम बात हो रहा है कि एनएच को अमूर्त करने की आवश्यकता नहीं है। – doe

+0

@doe - निश्चित रूप से आपके एनएच-विशिष्ट वर्ग केवल आपकी डोमेन संस्थाएं हैं? अन्यथा आप संपत्ति की पर्याप्त मात्रा-डुप्लिकेशंस और मैपिंग देख रहे हैं। –

उत्तर

13

सॉफ्टवेयर आर्किटेक्चर की दुनिया में कई विवादित राय हैं और इनमें से कई बहुत अच्छी तरह से स्थापित हैं।

1) हां, प्रत्येक समग्र रूट के लिए एक भंडार को परिभाषित करना अधिक हो सकता है, लेकिन आप पाते हैं कि जिस रूट को आप रूट के लिए डेटा पुनर्प्राप्त करते हैं, वह विशिष्ट हो सकता है और आप इसे एक कस्टम भंडार में नियंत्रित करने में सक्षम होना चाहते हैं । Ayende का लेख बहुत अधिक कह रहा है और विशिष्ट डेवलपर की 'ओवर-आर्किटेक्ट' समाधानों की इच्छा पर बारीकी से हिट करता है - अक्सर कार्यक्षमता के नुकसान के लिए।

2) एनएचबीर्नेट के साथ LINQ का उपयोग करना एक विकल्प है, लेकिन मुझे लगता है कि आपको मानदंड प्रश्नों या एचक्यूएल का उपयोग करने के लिए खुद को वापस करने की क्षमता देना चाहिए यदि आप ऐसा करते हैं। उस स्तर पर आप अपने आप को इतने सारे अपवादों में डाल सकते हैं कि आपको आश्चर्य होगा कि अमूर्तता का प्रारंभिक बिंदु क्या था।

3) QueryOver मानदंड प्रश्नों के आस-पास एक प्रकार-सुरक्षित रैपर है और यह अकेले उन्हें मेरे लिए अधिक आकर्षक बनाता है। मैं अक्सर अपने आप को उनके द्वारा प्रदान किए जाने वाले कड़े नियंत्रण के मानदंडों पर वापस आना पड़ता है - अक्सर झगड़ा होता है कि मुझे "जादू तार" का उपयोग करना पड़ता है। यह अनिवार्य रूप से एनएचबीर्नेट को आपके डेटा एक्सेस अमूर्तता को बनाएगा। वास्तव में, यह एक बेहतर अमूर्त होगा जो अधिकांश 'भंडार' है क्योंकि उनमें से अधिकतर केवल सीआरयूडी विधियों को प्रदान करते हैं ... एक भंडार क्वेरी विनिर्देशों को संभालने में सक्षम होना चाहिए (वास्तव में QueryOver काम करता है)।

जहां तक ​​लेन-देन जाते हैं - यह आपके ढांचे पर निर्भर करता है।हकीकत में, मुझे लगता है कि एक आवेदन में कार्य पैटर्न की इकाई का उपयोग करने के लिए इसकी यथार्थवादी या फायदेमंद नहीं है और इससे कार्यान्वयन छुपाएं (आप इसे अमूर्त कर सकते हैं - लेकिन क्या बात है? - क्या आप वास्तव में अपना ओआरएम बदलना चाहते हैं?)

यदि आप एएसपी.नेट का उपयोग कर रहे हैं तो बस (न्यूनतम पर) अनुरोध की शुरुआत में लेनदेन शुरू करें, अपवादों पर रोलबैक और अंत में प्रतिबद्ध करें।

यदि आप WinForms का उपयोग कर रहे हैं तो आपको प्रत्येक यूआई कार्य के जीवनकाल को अपने काम की इकाई मानने की आवश्यकता हो सकती है।

+0

टिप्पणी के समय आप 1337 पदक :) 6,907 s13 b37 मुझे +1 करने से डर है क्योंकि इससे प्रभाव खराब हो सकता है – Shagglez

2

साइट अब बंद हो गया है, लेकिन मैं वास्तव में बॉब Craven के दृष्टिकोण की तरह है और कुछ बड़े परियोजनाओं पर इसका इस्तेमाल किया:

http://blog.bobcravens.com/2010/06/the-repository-pattern-with-linq-to-fluent-nhibernate-and-mysql/ संपादित करें: Google cache version of the link

वह उपयोग करता जेनरिक और डेटा का उपयोग के लिए एक UOW पैटर्न ।

हाँ जब आपको SQL पर वापस गिरने की आवश्यकता होती है तो यह थोड़ी सी दर्द होती है लेकिन मैं डेटा सेवा परत का उपयोग करता हूं जो कि सार तत्व कर सकता है। अर्थात। डेटा सेवा परत जेनेरिक दाओ का उपयोग जहां संभव हो (90% समय) का उपयोग करती है और अन्य स्थानों में वेनिला एसक्यूएल/अन्य ढांचे का उपयोग करती है।

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