2009-07-14 10 views
7

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

अनिवार्य रूप से एक फ़ाइल (अब कोड की 15k लाइनों पर) है जो डेटा को पुनर्प्राप्त करने के लिए डेटासेट्स और टेबल एडाप्टर का उपयोग करने वाले डीएओ के समूह के बीच जाने के रूप में कार्य करती है। मेरी एक्सएसडी फाइलें इस तरह के आकार में उभरी हैं कि वे आर # को दृश्य स्टूडियो को हर बार खुलने के कारण क्रैश करते हैं और इंटरमीडिएरी क्लास जो अब 15k लाइनों का विश्लेषण करने के लिए आर # के लिए हमेशा के लिए लेती है। उल्लेख नहीं है कि यह बदसूरत है, यह काम करता है लेकिन अच्छी तरह से नहीं, और डीबग करने के लिए एक पूर्ण दुःस्वप्न है।

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

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

अग्रिम धन्यवाद!

संपादित करें: मुझे बताएं कि NHHernate क्यों काम नहीं करता है क्योंकि यह तत्काल प्रतिक्रिया प्रतीत होता है। मेरे उपयोगकर्ता एक "नौकरी" बनाते हैं जो वास्तव में मेरी नौकरी कक्षा का एक क्षणिक प्रतिनिधित्व है। इस नौकरी के भीतर वे इसे एक या वजन घटाने वाले कारकों की सूची देंगे जो सृजन के समय भी क्षणिक होते हैं। अंत में वे नौकरी के विवरणों की एक सूची प्रदान करते हैं जिनके पास उनके साथ एक विशेष वजन कारक होता है। चूंकि, डीबी में, जब मैं नौकरी को जारी रखने के लिए जाता हूं तो वज़न कारक अद्वितीय होते हैं और यह वजन घटाने के लिए नीचे गिर जाता है जब इसे डुप्लिकेट वज़न कारक मिलता है। मैंने वज़न कारक को विस्तार से पहले चेक करने की कोशिश की (जो मैं नहीं करना चाहता था क्योंकि मैं डीबी को अतिरिक्त कॉल नहीं चाहता) लेकिन एनएच में CreateCriteria को कॉल करने से सत्र में फ्लश होता है फैबियो, जो मेरे कैश को नष्ट कर देता है और इस तरह नौकरी के स्मृति प्रतिनिधित्व में पूरी तरह से मारता है। एनएच मेलिंग सूची में लोगों ने कहा कि मुझे GUID पर स्विच करना चाहिए, लेकिन यह एक व्यवहार्य विकल्प नहीं है क्योंकि रूपांतरण प्रक्रिया एक दुःस्वप्न होगी।

+1

NHibernate के साथ आपके पास क्या समस्याएं हैं? मैं बिना किसी मुद्दे के पहचान पीके के साथ इसका इस्तेमाल करता हूं। –

+1

हम्म, शायद वह लंबे समय तक चलने वाले सत्र (सत्र प्रति व्यापार लेनदेन मॉडल) का उपयोग करता है, और इस तरह के दृष्टिकोण में, पहचान का उपयोग करके निराश हो जाता है, क्योंकि यह आपके यूनिटफवर्क को तोड़ देता है (इसे एक नई इकाई डालने के बाद सीधे फ्लश करने की आवश्यकता होती है)। पहचान को छोड़ने के लिए एक समाधान हो सकता है, और HiLo पहचान जेनरेटर का उपयोग करें। –

+0

आह हाँ, यह एक संभावना है (और आपका समाधान)। –

उत्तर

1

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

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

बिल्कुल मेरा मतलब बताता है।

मैंने जो किया है वह एक्टिव रिकार्ड पैटर्न के कुछ हद तक एक बेस क्लास तैयार किया गया है, जिसे मैं उत्तराधिकारी वर्ग से प्राप्त करता हूं और उन गुणों के साथ चिह्नित करता हूं जो इसे एक संग्रहित प्रक्रिया में संलग्न करते हैं, चयन, सम्मिलित करें, अपडेट करें और हटाएं । बेस क्लास गुणों को पढ़ने के लिए प्रतिबिंब का उपयोग करता है और वर्ग के गुण मानों को एसपी पैरामीटर को असाइन करता है, और चयन() के मामले में, जेनरिक्स की सूची के गुणों के लिए परिणाम SQLDataReader के कॉलम मान असाइन करें।

interface IDataObjectBase<T> 
    { 
     void Delete(); 
     void Insert(); 
     System.Collections.Generic.List<T> Select(); 
     void Update(); 
    } 

यह इसे से एक डेटा वर्ग पाने का एक उदाहरण है:

यह वही है DataObjectBase लग रहा है की तरह है,

[StoredProcedure("usp_refund_CustRefundDetailInsert", OperationType.Insert)] 
    [StoredProcedure("usp_refund_CustRefundDetailSelect", OperationType.Select)] 
    [StoredProcedure("usp_refund_CustRefundDetailUpdate", OperationType.Update)] 
    public class RefundDetail : DataObjectBase<RefundDetail> 
    { 

     [StoredProcedureParameter(null, OperationType.Update, ParameterDirection.Input)] 
     [StoredProcedureParameter(null, OperationType.Insert, ParameterDirection.Output)] 
     [StoredProcedureParameter(null, OperationType.Select, ParameterDirection.Input)] 
     [ResultColumn(null)] 
     public int? RefundDetailId 
     { get; set; } 

     [StoredProcedureParameter(null, OperationType.Update, ParameterDirection.Input)] 
     [StoredProcedureParameter(null, OperationType.Insert, ParameterDirection.Input)] 
     [StoredProcedureParameter(null, OperationType.Select, ParameterDirection.Input)] 
     [ResultColumn(null)] 
     public int? RefundId 
     { get; set; } 
     [StoredProcedureParameter(null, OperationType.Update, ParameterDirection.Input)] 
     [StoredProcedureParameter(null, OperationType.Insert, ParameterDirection.Input)] 
     [ResultColumn(null)] 
     public int RefundTypeId 
     { get; set; } 

     [StoredProcedureParameter(null, OperationType.Update, ParameterDirection.Input)] 
     [StoredProcedureParameter(null, OperationType.Insert, ParameterDirection.Input)] 
     [ResultColumn(null)] 
     public decimal? RefundAmount 
     { get; set; }   
     [StoredProcedureParameter(null, OperationType.Update, ParameterDirection.Input)] 
     [StoredProcedureParameter(null, OperationType.Insert, ParameterDirection.Input)] 
     [ResultColumn(null)] 
     public string ARTranId 
     { get; set; } 

    } 

मैं जानता हूँ कि ऐसा लगता है जैसे मैं पहिया पुनर्रचना रहा हूँ, लेकिन मुझे मिली सभी पुस्तकालयों में या तो अन्य पुस्तकालयों (ActiveRecord + NHibernate, उदाहरण के लिए, जो एक करीबी दूसरा था) पर बहुत अधिक निर्भरता थी या उपयोग और प्रशासन करने के लिए बहुत जटिल थे।

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

+0

यह दिलचस्प है, यह थोड़ा वर्बोज़ है, लेकिन बहुत रोचक है। क्या आपकी रणनीति किसी कैशिंग के लिए अनुमति देती है? – joshlrogers

+0

एक और बात: यह मौजूदा संग्रहित प्रोसेस की लाइब्रेरी के साथ भी बहुत अच्छा काम करती है। कोई आवश्यकता नहीं है कि उन्हें एक निश्चित तरीके से नामित किया गया हो या गैर-मनमाना पैरामीटर नाम या ऑर्डर न हों। –

+0

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

0

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

1

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

+0

क्या आप इसे मेटा डेटा मैपर और/या डेटा मैपर के साथ संयोजन में उपयोग करते हैं? इसके अलावा आप जॉइन या संदर्भित कक्षाओं से कैसे निपटते हैं? – joshlrogers

+1

@joshlrogers कोई डेटा मैपर नहीं - प्रत्येक तालिका को डीएओ कक्षा द्वारा दर्शाया जाता है। जॉइन को प्रत्येक डीएओ में गेटजोइन विधि लागू करके परिभाषित किया जाता है जो अन्य तालिकाओं के आधार पर उपयुक्त जॉइन स्टेटमेंट देता है। प्रत्येक शामिल डीएओ में शामिल तालिका के लिए एक सूची या वस्तु है। क्वेरी समय पर रचनाकारों को चेन करके परिभाषित किया जाता है - उदाहरण: सूची = SQL.Read (खोजक्रिया, नया (उत्पाद (नया ऑर्डर())) उत्पाद और ऑर्डर के बीच एक सहभागिता देता है। –

0

हाल की परियोजनाओं में हमने एक अलग डीएएल प्रोग्रामिंग को रोक दिया है।

इसके बजाय हम एक ऑब्जेक्ट रिलेशनल मैपर (हमारे मामले इकाई फ्रेमवर्क में) का उपयोग करते हैं। फिर हम व्यापार परत कार्यक्रम सीधे ओआरएम के खिलाफ देते हैं।

इसने हमें कुछ मामलों में 90% से अधिक विकास प्रयासों को बचाया है।

+0

यही कारण है कि मैं NHibernate पर स्विच करना चाहता था दुर्भाग्यवश यह काम नहीं कर सका। – joshlrogers

0

मेरा पहला कदम 15 केएलओसी राक्षस से कोड तोड़ना होगा, फिर एक नया डीएएल बनाने की रणनीति तैयार करें।

0

एसक्यूएल सर्वर का उपयोग कर रहे हैं तो SQL से लिंक अच्छा है। LinqToSQL प्रदाता के लिए एक्सेस और MySQL के लिए वहां स्रोत है। हालांकि मैंने इसका परीक्षण नहीं किया है। LinqToSql यूनिटऑफवर्क मॉडल का पालन करता है जो कि ADO.NET फ़ंक्शंस के समान है। आप डेटा की स्थानीय प्रति में परिवर्तनों की एक श्रृंखला बनाते हैं, फिर एक अपडेट कॉल के साथ सभी परिवर्तनों को प्रतिबद्ध करते हैं। मुझे लगता है कि यह बहुत साफ है।

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

आप डेटाटेबल से डेटासोर्स में परिवर्तन लिखने का प्रभारी होंगे। मैं एक सामान्य वर्ग या विधि लिखूंगा जो अद्यतन, आवेषण और हटा देता है।

शुभकामनाएं!

0

मैं सबसे तेज़ डेटा पुनर्प्राप्ति और एल 2 एस के लिए एसपी के लिए मेरा रैपर का उपयोग करता हूं जब परफॉर्मेंस लक्ष्य नहीं होता है। मेरा डीएएल भंडार पैटर्न और टीडीडी के लिए encapsulated तर्क का उपयोग करता है।

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