2009-02-20 16 views
6

मैं डेटा एक्सेस लेयर (डीएएल) को कार्यान्वित कर रहा हूं, जो मूल रूप से डेटाबेस (सीआरयूडी) कॉल निष्पादित करने के लिए कक्षाओं (VB.NET) के साथ कक्षाओं का एक सेट है। मैं कक्षा पदानुक्रम के भीतर डीएएल को कॉल करने के लिए सबसे अच्छी जगह का पता लगाने की कोशिश कर रहा हूं। मुझे एक उदाहरण देने दें।ओओपी - डेटा एक्सेस लेयर पर कॉल कहां रखा जाए?

मान लीजिए कि मेरे पास क्लास ग्राहक है, केवल मानक आईडी, नाम, पता 1, आदि गुणों के साथ और शायद एक ओवरराइड ToString फ़ंक्शन या तो। , हालांकि

Me.DataGridView1.Datasource = Dal.Customer.ReadList 

यह एक अच्छा अभ्यास करने के लिए नहीं है:

(pseudocode) 

Namespace Dal 

Public Class Customer 

Public Shared Function Read(id As Integer) As Customer 

Public Shared Function ReadList() As List(Of Customer) 

Public Shared Sub Create(c As Customer) 

'etc. 

अब, मैं दल प्रस्तुति परत से तो जैसे कह सकते हैं: मैं भी इस तरह के रूप में साझा विधियों, के साथ एक दाल वर्ग है क्या प्रस्तुति परत दल के बारे में जागरूक है? क्या मुझे इसके बजाय ग्राहक ऑब्जेक्ट में विधियां डालना चाहिए और इस तरह दल को कॉल करना चाहिए?

Public Function ReadList() As List(Of Customer) 
    Return Dal.Customer.ReadList() 
End Sub 

Public Sub Create() 
    Dal.Customer.Create(Me) 
End Sub 

क्या यह "क्लीनर" ओओपी होगा? या प्रस्तुति देने के लिए स्वीकार्य अभ्यास है कि मेरे पिछले उदाहरण की तरह व्यावसायिक वस्तुओं को पारित करने दें:

Me.DataGridView1.Datasource = Dal.Customer.ReadList 

Dim c As New Customer 
c.Name = "Alpha Corporation" 
c.Address1 = "123 Main Street" 
Dal.Customer.Create(c) 

आपकी प्रतिक्रिया के लिए धन्यवाद।

उत्तर

2

मैं मानता हूं कि डेटा कॉल यूआई परत में नहीं हैं। वे केवल प्रस्तुति के लिए हैं।

मुझे लगता है कि वे एक सेवा परत में ठीक से संबंधित हैं। सेवा कार्यान्वयन अपने लक्ष्यों को पूरा करने के लिए मॉडल ऑब्जेक्ट्स और दृढ़ता परत का उपयोग करता है। चाहे वह एक्सएमएल-आधारित वेब सेवा या स्थानीय इंटरफेस है, सेवा वह ऑब्जेक्ट है जो मामलों का उपयोग करने के लिए मानचित्र बनाती है और काम की इकाइयों के बारे में जानता है।

या तो डेटाबेस को अलग-अलग दृढ़ता परत में डालें या उन्हें अतिरिक्त ऑब्जेक्ट-उन्मुख शुद्धता के लिए मॉडल ऑब्जेक्ट्स में एम्बेड करें।

+0

सभी तीन उत्तरदाताओं ने बहुत अच्छे जवाब दिए, लेकिन मुझे एक को सही के रूप में चुनना है। सबको धन्यवाद! – HardCode

4

आपका आवेदन आपके डीएएल के बारे में बेहतर जानता है। ऐसा करने के कई तरीके हैं और मुझे लगता है कि आप सही रास्ते पर हैं। मुझे लगता है कि आप इस कार्यान्वयन के लिए factory pattern पर देखना चाहेंगे क्योंकि आप कारखाने के पीछे डीएएल कार्यान्वयन को छिपाने में सक्षम होंगे और कारखाने से इकाइयों और इकाइयों के संग्रह वापस कर पाएंगे।

+0

तो कारखाने में प्रस्तुति परत कॉलिंग विधियों के साथ कारखाना डीएएल और प्रस्तुति परत के बीच बैठेगा? क्या यह duffymo द्वारा संदर्भित सेवा परत के समान है? – HardCode

+0

सॉर्ट करें - कारखाना पैटर्न केवल एक पैटर्न है - यदि आप चाहें तो इसे सेवा परत के रूप में कार्यान्वित किया जा सकता है। –

1

कारण आप सीआरयूडी संचालन को एक अलग परत में खींचना चाहते हैं, यदि आप कभी भी डेटाबेस सिस्टम को बदलना चाहते हैं। खैर, यही कारण है कि मैंने ऐसा किया। मैं सिर्फ ओओडी होने के लिए ऐसा करने की सिफारिश नहीं करता। लेकिन यहाँ फिर जाना ... कक्षाएं/इंटरफेस की

कई सेट

BusinessObject - इस तरह के एक ग्राहक के रूप में व्यापार प्रकार संस्थाओं का प्रतिनिधित्व करता है, एक संपत्ति के रूप में DataManager है।

DataManager - हो सकता है कि आप एक बेहतर नाम के साथ आने सकता है, लेकिन इस बात BusinessObjects

SearchList के लिए लोड() और सहेजें() फ़ंक्शन प्रदान करता है - रिटर्न चीजों की सूची, अपने एसक्यूएल प्रश्नों यहां जाएं। इसके अलावा यह संभवतः अगला(), Eof(), और CurrentRecord प्रकार के सदस्यों के साथ रिकॉर्डसेट की तरह व्यवहार करना चाहिए

कंस्ट्रक्टर/फैक्टरी - फैक्टरी पैटर्न देखें। आपने अपने डेटाबेस ऑब्जेक्ट्स से अपने डेटाबेस ऑपरेशंस को डी-युग्मित कर दिया है, यह चीज उन्हें एक आवश्यक तरीके से फिर से जोड़ती है।BusinessObject

पर उचित डेटामैनेजर कार्यान्वयन असाइन करता है जो भी आप चाहते हैं कि वास्तविक नाम के साथ आते हैं, लेकिन फिर से ग्राहक के बारे में बात करते हैं। मान लें कि आपके पास ओरेकल डेटाबेस है। आप इन वर्गों के साथ खत्म हो सकता है:

boCustomer कि BusinessObject से विरासत

oracleDMCustomer कि विरासत या लागू करता DataManager

searchlistCustomer है कि या तो सार तरीकों के माध्यम से या की तरह एक अंतरफलक कुछ के रूप में सामने आ रहा है कि searchlist से विरासत:

  • SearchAll() - जो सभी ग्राहक लौट जाना
  • SearchByZip (स्ट्रिंग ज़िप) लौटना चाहिए जो दिए गए ज़िपकोड

oracleSearchlistCustomer साथ सभी ग्राहकों - लागू करता searchlistCustomer, वास्तव में SearchAll() और SearchByZip लागू करेगा()

boFactory - स्थिर वर्ग एक विधि है कि CreateObject (प्रकार प्रकार)

तरह दिखता है

searchlistFactory - स्थैतिक वर्ग जिसमें एक विधि है जो CreateSearchList (प्रकार का प्रकार) जैसा दिखता है;

मैं आपको कुछ रिक्त स्थान भरने दूँगा, लेकिन मुझे लगता है कि महत्वपूर्ण चीजें हैं। दूसरों के पास अलग-अलग विचार हो सकते हैं जिनके लिए कम अमूर्तता की आवश्यकता होती है। मैं एक के साथ जाने से पहले कई रणनीतियों का मज़ाक उड़ाऊंगा।

+0

अच्छी चीजें। धन्यवाद! – HardCode

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