2009-03-14 17 views
6

मेरा वर्तमान एप्लिकेशन एक इंस्टेंस आधारित डेटा एक्सेस लेयर का उपयोग कर रहा है। मैं कनेक्शन स्ट्रिंग के साथ परत को तुरंत चालू करता हूं। मैं फिर एक विधि कहता हूं जो कुछ प्रकार की कमांड करेगा। उदाहरण के लिए एक विधि है जो एक डेटासेट भर जाएगी। असल में, मैं संग्रहीत प्रक्रिया और किसी भी SQL पैरामीटर को पास करता हूं और डेटासेट वापस लेता हूं। क्या मेरे डेटा एक्सेस या इंस्टेंस आधारित को संभालने के लिए एक स्थिर वर्ग होना बेहतर है? मेरे पास ऑब्जेक्ट्स के साथ एक डोमेन परत है, लेकिन मैं ओआरएम की तरह ऑब्जेक्ट्स मैप नहीं कर रहा हूं। मैं वस्तुओं को कारखानों में गुजर रहा हूं जो डेटासेट को वापस खींचने के लिए डेटा परत को तुरंत चालू करता है। मैं फिर ऑब्जेक्ट में डेटासेट को मैप करता हूं। मैं अपना ऐप अपडेट करने की योजना बना रहा हूं (और हाँ सी # पर जा रहा है), लेकिन मेरे पास पूरी चीज़ बदलने का समय नहीं है। मैं आवेषण अद्यतन, और Deletes के लिए एक ही बात करता हूँ। अगर मैं कर रहा हूं तो अभी ठीक है, मुझे बताएं। क्या आप इस दृष्टिकोण के साथ कोई समस्या देखते हैं? अन्यथा, मुझे क्या करना चाहिए? मैंने इस वर्ग को नहीं लिखा था। मैंने इसे ऑनलाइन पाया और सोचा कि मुझे यही चाहिए।डाटा एक्सेस लेयर स्टेटिक या इंस्टेंस आधारित?

यहाँ डेटा वर्ग का एक उदाहरण है:

Public Sub New(ByVal connectionString As String) 
     _connectionString = connectionString 
    End Sub 

Public Function FillDataset(ByVal cmd As String, ByVal cmdType As CommandType, Optional ByVal parameters() As SqlParameter = Nothing) As DataSet 
     Dim connection As SqlConnection = Nothing 
     Dim command As SqlCommand = Nothing 
     Dim sqlda As SqlDataAdapter = Nothing 
     Dim res As New DataSet 
     Try 
      connection = New SqlConnection(_connectionString) 
      command = New SqlCommand(cmd, connection) 
      command.CommandType = cmdType 
      AssignParameters(command, parameters) 
      sqlda = New SqlDataAdapter(command) 
      sqlda.Fill(res) 
     Catch ex As Exception 
      'CreateDataEntry(ex, WriteType.ToFile, cmd) 
     Finally 
      If Not (connection Is Nothing) Then connection.Dispose() 
      If Not (command Is Nothing) Then command.Dispose() 
      If Not (sqlda Is Nothing) Then sqlda.Dispose() 
     End Try 
     Return res 
    End Function 

     Public Function ExecuteNonQuery(ByVal spname As String, ByVal ParamArray parameterValues() As Object) As Object 
     Dim connection As SqlConnection = Nothing 
        Dim command As SqlCommand = Nothing 
     Dim res As Object = Nothing 
     Try 
      connection = New SqlConnection(_connectionString) 
      command = New SqlCommand(spname, connection) 
      command.CommandType = CommandType.StoredProcedure 
      command.Parameters.AddRange(parameterValues) 
      connection.Open() 
      command.ExecuteNonQuery() 
      res = command.Parameters(command.Parameters.Count - 1).Value 
     Catch ex As Exception 
      CreateDataEntry(ex, WriteType.ToFile, spname) 
      If Not (transaction Is Nothing) Then 
       transaction.Rollback() 
      End If     
     Finally 
      If Not (connection Is Nothing) AndAlso (connection.State = ConnectionState.Open) Then connection.Close() 
      If Not (command Is Nothing) Then command.Dispose()     
     End Try 
     Return res 
    End Function 

उत्तर

7

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

+0

मैं पूरी तरह से सहमत हूं। मैं LINQtoSQL का उपयोग करने के लिए सबसे ज्यादा पसंद कर रहा हूँ। मेरे पास पहले से ही मेरे ऐप के अगले पुनरावृत्ति के लिए कुछ विचार और कोड लिखा गया है। आपके सहयोग के लिए धन्यवाद! – DDiVita

1

उदाहरण आधार एक अधिक लचीला है।

आप अंतर्निहित तकनीक को आसानी से बदल सकते हैं (केवल एक अलग कार्यान्वयन प्रदान करें)।

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

+1

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

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