Extiende las funciones de clase con código común repetible

aop dapper logging oop vb.net

Pregunta

Yo uso Dapper para acceder a mis datos, según el código a continuación. Solo hay dos funciones, pero el código real puede tener hundreads. Me gustaría ingresar en una tabla de base de datos específica todas las sentencias SQL ejecutadas. Esto debería ser universal en todas las funciones de clase de DataRepository.

¿Cuál es la mejor manera de implementar dicha funcionalidad para evitar repetirla dentro de cada función individual como SelectCustomers , SelectEmployees , etc.? Por favor comparta un ejemplo.

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

Respuesta aceptada

Puede mantenerlo simple y simplemente agregar un método a la clase base:

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

Y usa eso en tus métodos de repositorio:

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


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué