使用可重复的公共代码扩展类函数

时间:2016-11-22 17:34:36

标签: vb.net oop logging aop dapper

我使用Dapper来访问我的数据,如下面的代码所示。只有两个函数,但真正的代码可以有hundreads。我想在特定的数据库表中登录所有执行的SQL语句。这应该是所有DataRepository类函数的通用。

实现此类功能的最佳方法是什么,以避免在SelectCustomersSelectEmployees等每个单一函数中重复此功能?请分享一个例子。

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

1 个答案:

答案 0 :(得分: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