डेटा एक्सेस लेयर के भीतर व्यावसायिक वस्तुएँ


12

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

माय डेटा एक्सेस लेयर (DAL फॉर शॉर्ट) के तरीके, बहुत सरल हैं। वे डेटाबेस में संग्रहीत प्रक्रियाओं के अनुरूप हैं (चीजों को साफ रखने के लिए इसमें कॉल करने का कोई अन्य तरीका नहीं है), और उनके पास वही पैरामीटर हैं जो प्रक्रियाएं करते हैं। वे तो बस डेटाबेस से कनेक्ट करते हैं, और क्वेरी परिणाम वापस करते हैं। यहाँ एक उदाहरण है:

public int DeleteRecord(int recordId)
{
    recordId.RequireThat("recordId").NotZeroOrLess();

    List<SqlParameter> parameters = new List<SqlParameter>();
    parameters.Add(new SqlParameter { ParameterName = "@RecordId", SqlDbType = SqlDbType.Int, Direction = ParameterDirection.Input, Value = recordId});

    return this.ExecuteNonQuery("DeleteRecord", parameters.ToArray());
}

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

हालांकि, एक और डीएएल विधि में कहें, मैं एक रिकॉर्ड लोड करना चाहता हूं। मेरी लोड प्रक्रिया selectsतालिकाओं के एक समूह के खिलाफ निष्पादित करने जा रही है और वापस लौट रही है DataSet, लेकिन मैं इस बात से जूझ रहा हूं कि क्या मेरे डीएएल को उपयोग करने की विधि के भीतर व्यावसायिक ऑब्जेक्ट बनाना चाहिए DataSet, या यदि मेरी व्यावसायिक ऑब्जेक्ट्स में केवल एक Load()विधि होनी चाहिए जो प्राप्त होती है DataSetदाल से, और फिर मूल रूप से खुद को भरता है।

इसे डीएएल के माध्यम से करने से व्यावसायिक वस्तुओं में कम तर्क होगा (भले ही यह सिर्फ चुनिंदा तर्क है, यह अभी भी तर्क है), लेकिन डीएएल को थोड़ा भीड़ देगा और ऐसा महसूस कराएगा कि यह वास्तव में कुछ कर रहा है कि यह होना चाहिए ' t कर रहे हो।

आप लोग क्या सोचते हैं?


आपने एंटिटी फ्रेमवर्क का उपयोग क्यों नहीं किया?
jfrankcarr

@jfrankcarr - ईमानदार होना, मुख्य रूप से क्योंकि मैं इससे परिचित नहीं हूं जैसा कि मुझे होना चाहिए। हालाँकि मुझे अपनी तालिकाओं को फिर से बनाने और उचित विदेशी कुंजियों आदि को जोड़ने की आवश्यकता होगी, ताकि एंटिटी फ्रेमवर्क रिश्तों को ठीक से पहचान सके। जिज्ञासा से बाहर, हालांकि, अगर मैं इसका उपयोग कर रहा था, तो क्या मैं केवल व्यवसाय की वस्तुओं के साथ ढांचे का उपयोग करके सभी चयन करूंगा, या अभी भी एक निर्णय होगा कि उन LINQ प्रश्नों को कहां रखा जाए?

मैं ईएफ सीखने के लिए समय लेने की सलाह दूंगा। यह पहली बार में थोड़ा कठिन लग सकता है, खासकर जब इसे मौजूदा डेटाबेस के साथ फिट करने की कोशिश की जाती है जिसमें कुछ पहले से मौजूद डिज़ाइन मुद्दे होते हैं, लेकिन यह इसके लायक है।
jfrankcarr

यदि आप किसी अन्य विकल्प को देखना चाहते हैं तो आप NHibernate को भी देख सकते हैं।
01001100

@jfrankcarr - मैं निश्चित रूप से इस पर गौर करूंगा, लेकिन यह बहु-स्तरीय डेटा एक्सेस एप्लिकेशन के साथ कैसे फिट होता है? क्या इकाई ढांचा खुद डीएएल के भीतर, या किसी अन्य परत के भीतर या यहां तक ​​कि बिजनेस ऑब्जेक्ट्स के भीतर भी लागू किया जाएगा?

जवाबों:


4

आपकी DAL को आपके डेटा ऑब्जेक्ट वापस करने चाहिए

आदर्श रूप से आपका डीएएल एक "ब्लैक बॉक्स" ऑब्जेक्ट होना चाहिए, जो आपके एप्लिकेशन कोड का उपयोग डेटा ऑब्जेक्ट के लिए पूछने या मौजूदा डेटा ऑब्जेक्ट्स में हेरफेर करने के लिए कर सकता है। कभी-कभी DAL और अनुप्रयोग कोड के बीच एक और परत डाल दी Repositoryजाती है, जिसे आगे दो परतों को अलग किया जाता है, हालांकि इसकी हमेशा जरूरत नहीं होती है।

इसके अलावा, आप आमतौर पर नहीं चाहते हैं कि आपकी व्यावसायिक वस्तुएं खुद को बनाने में सक्षम हों। यह सुरक्षा छेद का कारण बन सकता है जहां कोई आपके पुस्तकालय का उपयोग कर सकता .Load(someId)है, और उस पर कॉल करके अपनी वस्तु का एक नया उदाहरण बना सकता है, और यह दो परतों को एक साथ मिला देता है जो पूरी तरह से अलग होनी चाहिए।

मैं एक .Load(DataSet ds)विधि प्रदान करने की अनुशंसा नहीं करता क्योंकि यदि डेटा सेट परिभाषा बदल जाती है, तो आपको उन डेटा ऑब्जेक्ट्स का शिकार करना होगा जो उस डेटा सेट का उपयोग करते हैं और उन्हें बदलते हैं। आपके सभी डेटा एक्सेस कोड को एक स्थान पर रखना आसान है, इसलिए यदि आप डेटा एक्सेस क्वेरी को बदलते हैं, तो आपको केवल अपनी DAL परत को बदलना होगा।


यह निश्चित नहीं है कि "सही वस्तु को वापस करने" पर एक परत कैसे निर्भर हो सकती है यदि "सही वस्तु" की परिभाषा किसी अन्य परत में होती है।
TMN

@TMN जो बुरी तरह से शब्द था। मैंने शब्दों को थोड़ा बदल दिया है क्योंकि आप सही हैं, ऐप कोड को पता होना चाहिए कि इसके लिए किस तरह की वस्तु है।
राहेल

@ राचल - गोत्र। तो आप डीएएल को अपने व्यापार वस्तु जो भी हो, का एक उदाहरण वापस करने की सलाह देंगे, सही है? मैं "डेटा ऑब्जेक्ट्स" के आपके शब्दों द्वारा मुझे भ्रमित कर रहा था, लेकिन मुझे लगता है कि मैं इसे समझता हूं। इस तरह, मेरा कोड एक व्यावसायिक वस्तु का अनुरोध कर सकता है जहाँ से उसे ज़रूरत है (स्वयं उनके माध्यम से नहीं), सिर्फ कॉल करने से BusinessObject bo = DAL.LoadRecord(id);- सही आवाज़? बीओ को क्वेरी को मैप करने का तर्क केवल डीएएल के भीतर ही निहित होगा, और केवल वहीं।

1
@ यह सही है, हालाँकि मैं Getइसके बजाय DAL विधि को कुछ नाम दूंगा Load, जैसेCustomer c = DAL.GetCustomer(id);
राहेल

2

मेरा तरीका, LINQ-To-SQL और Entity फ्रेमवर्क से पहले भी, एक इंटरफ़ेस और अमूर्त वर्ग पुस्तकालय था, जो ऐप की विभिन्न परतों के बीच संचार के लिए "लिखित अनुबंध" प्रदान करता था। इसे कभी-कभी एक ऑन्कोलॉजी कहा जाता है , जो कार्य डोमेन के लिए एक परिभाषा है। परतों के बीच से जो भी गुजरता था वह इस 'अनुबंध' का इस्तेमाल करता था।

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

उदाहरण कोड आपके पास LINQ से पहले के कोड के समान दिखता है। मेरे पास एक सामान्य डीबी फ़ंक्शन क्लास था जो मैंने अपने डीएएल ऑब्जेक्ट्स के अंदर उपयोग किया था। डीएएल कक्षाएं डेटा को पढ़ती हैं और इसे 'अनुबंध' ऑब्जेक्ट में फिट करती हैं। स्केलर परिणाम, आपके हटाए गए उदाहरण की तरह, एक मूल्य लौटाएगा, आमतौर पर एक बूलियन।


1
"डेटा परत से व्यवसाय की परत तक कच्चे डेटासेट ऑब्जेक्ट्स को पास करने का विचार मुझे पसंद नहीं है।" इस। एक हजार बार, यह।
जोशुआ स्मिथ

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

मैं आमतौर पर कॉल / अपडेट / डिलीट के लिए एक बूलियन वापस करता हूं जब तक कि मुझे प्रभावित रिकॉर्ड की संख्या की आवश्यकता न हो। उदाहरण के लिए, मैं एक इंट वापस कर सकता हूं यदि एक संग्रहीत प्रॉपर्टी कई ऑर्डर लाइनों या कुछ इस तरह की प्रक्रिया कर रही है।
jfrankcarr

0

आपका DAL एक डेटासेट वापस करना चाहिए। डेटासेट लौटा हुआ बिसनेस ऑब्जेक्ट होना चाहिए, ऐसा कुछ भी नहीं होना चाहिए, जो आपको यह जांचने के अलावा हो कि उसमें अपेक्षित डेटा है। यदि आपको इसके साथ और अधिक करने की आवश्यकता है तो आप या तो एक ही संग्रहीत प्रक्रिया में बहुत अधिक करने की कोशिश कर रहे हैं या संग्रहीत प्रक्रिया में डेटा को ठीक से वापस नहीं कर रहे हैं।


0

मेरा सुझाव है कि आपके व्यवसाय की वस्तुओं में एक परिणाम सेट से खुद को आबाद करने के लिए एक निर्माता है। यह आपके DAL और व्यावसायिक परत के बीच युग्मन को हटा देता है। यदि आप दोनों को पूरी तरह से अलग करना चाहते हैं, तो अपने परिणाम सेट से कॉलम नाम => मूल्य जोड़े का एक सरल नक्शा बनाएं और उसे कंस्ट्रक्टर के पास भेजें।

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