2016-11-22 75 views
0

我用Dapper來訪問我的數據,如下面的代碼。只有兩個函數,但真正的代碼可以擁有hundreads。我想登錄一個特定的數據庫表中所有執行的SQL語句。這應該在所有DataRepository類功能中通用。擴展類的功能與重複公共代碼

實現此功能以避免在每個單一功能(如SelectCustomers,SelectEmployees等)中重複執行此功能的最佳方法是什麼?請分享一個例子。

Public Class BaseRepository 
Protected Shared Function OpenConnection() As IDbConnection 
    Dim connection As IDbConnection 
    connection = New SqlConnection(MyAppSettings.PascomDB) 
    connection.Open() 
    Return connection 
End Function 
End Class 


Public Class DataRepository 
Inherits BaseRepository 
Public Function SelectCustomers() As IEnumerable(Of Customers) 
    Using connection As IDbConnection = OpenConnection() 
     Dim query As String = "SELECT * FROM Customers" 
     Return connection.Query(Of Customers)(query) 
     connection.Close() 
    End Using 
End Function 

Public Function SelectEmployees() As IEnumerable(Of Employees) 
    Using connection As IDbConnection = OpenConnection() 
     Dim query As String = "SELECT * FROM Employees" 
     Return connection.Query(Of Employees)(query) 
     connection.Close() 
    End Using 
End Function 
End Class 
+0

我想你應該尋找到面向方面編程。 – plalx

回答

1

你可以保持它的簡單,只需添加一個方法到基類:

Public Class BaseRepository 

    ' ... 

    Protected Shared Function LogAndQuery(Of T)(query As String) As IEnumerable(Of T) 
     Using connection As IDbConnection = OpenConnection() 
      ' TODO: add logging of the query here 
      Return connection.Query(Of T)(query) 
      ' connection.Close() - note, this is unreachable code, but it's being disposed anyway 
     End Using 
    End Function 

End Class 

和使用,在你的資料庫的方法:

Public Function SelectCustomers() As IEnumerable(Of Customers) 
    Dim query As String = "SELECT * FROM Customers" 
    Return LogAndQuery(Of Customers)(query) 
End Function