2016-11-22 23 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