2009-03-14 19 views
6

Ứng dụng hiện tại của tôi đang sử dụng lớp truy cập dữ liệu dựa trên cá thể. Tôi khởi tạo lớp với chuỗi kết nối. Sau đó tôi gọi một phương thức sẽ thực hiện một số lệnh. Ví dụ có một phương pháp sẽ điền vào một tập dữ liệu. Về cơ bản, tôi vượt qua các thủ tục được lưu trữ và bất kỳ tham số SQL và lấy lại một tập dữ liệu. Có tốt hơn để có một lớp tĩnh để xử lý truy cập dữ liệu của tôi hoặc một cá thể dựa? Tôi có một lớp miền với các đối tượng, nhưng tôi không lập bản đồ các đối tượng như một ORM. Tôi đang truyền các đối tượng này vào các nhà máy, sau đó tạo lớp dữ liệu để lấy lại một tập dữ liệu. Sau đó tôi ánh xạ tập dữ liệu cho đối tượng. Tôi dự định cập nhật ứng dụng của mình (và chuyển sang C#), nhưng tôi không có thời gian để thay đổi toàn bộ. Tôi làm điều tương tự cho bản cập nhật chèn và xóa. Nếu những gì tôi đang làm là OK ngay bây giờ, hãy cho tôi biết. Bạn có thấy bất kỳ vấn đề nào với cách tiếp cận này không? Nếu không, tôi nên làm gì? Tôi đã không viết lớp này. Tôi tìm thấy nó trên mạng và nghĩ rằng đây là những gì tôi cần.Lớp truy cập dữ liệu Tĩnh hoặc Sơ thẩm dựa trên?

Dưới đây là một ví dụ của lớp dữ liệu:

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 

Trả lời

7

Đầu tiên, tôi nghĩ rằng cách tiếp cận dụ dựa trên là đúng. Sử dụng các lớp tĩnh sẽ làm cho nó khó khăn hơn nhiều để đơn vị kiểm tra DAL của bạn và giả lập DAL của bạn khi đơn vị kiểm tra các lớp khác. Thứ hai, tôi nghĩ bạn nên xem xét lại việc xây dựng DAL của riêng bạn. Bạn sẽ đầu tư nhiều thời gian vào việc tạo, duy trì và kiểm tra DAL khi có thể, bằng cách sử dụng ORM hiện có (được thử nghiệm tốt) - như LINQtoSQL, nHibernate, nTier hoặc thậm chí Entity Framework - dành nhiều thời gian hơn cho mã trực tiếp mang lại lợi ích cho nhu cầu kinh doanh của bạn. Tôi đã thực hiện cả hai, DAL được xây dựng bằng tay và ORM, trong trường hợp của tôi LINQtoSQL, và tôi thấy rằng tôi dành ít thời gian hơn để kiểm tra (và sửa) DAL của tôi đi theo tuyến ORM.

+0

Tôi hoàn toàn đồng ý. Tôi thích sử dụng LINQtoSQL nhất. Tôi đã có một số ý tưởng và mã được viết cho lần lặp tiếp theo của ứng dụng của tôi. Cảm ơn vì đầu vào của bạn! – DDiVita

1

Trường hợp cơ sở cá thể linh hoạt hơn.

Bạn có thể dễ dàng thay đổi công nghệ cơ bản hơn (chỉ cần cung cấp triển khai khác).

Bạn cũng có thể ủy quyền lớp truy cập dữ liệu. Trong trường hợp của tôi, gần đây tôi đã thực hiện điều này để kiểm tra xem có cái gì đó trong cơ sở dữ liệu cục bộ hay không, và nếu không nhận được một bản sao của nó từ một cơ sở dữ liệu từ xa và lưu nó cục bộ. Điều này đã được thực hiện hoàn toàn minh bạch với phần còn lại của ứng dụng.

+1

Tôi đoán tôi đang thiếu cách bạn không thể sử dụng triển khai khác nếu bạn sử dụng DAL dựa trên tĩnh? Nếu bạn muốn làm một cái gì đó khác nhau cho một phương pháp cụ thể, thay đổi phương pháp. Với tôi đó là điểm của việc sử dụng một DAL ở tất cả so với chỉ nhận được dữ liệu thẳng trong phương pháp gọi. –

Các vấn đề liên quan