Añadir Dapper a Enterprise Library?

.net dapper enterprise-library orm

Pregunta

Estamos utilizando Enterprise Library como DAL estándar. Ahora, me gustaría disfrutar de los beneficios de Dapper. En cuanto a la implementación, solo está ampliando la clase de conexión.

¿Es concebible configurar a Dapper para que extienda Enterprise Library para que podamos disfrutar de ambos mundos? O tal vez alguien ya creó esto?

Respuesta aceptada

Sí, es concebible, y funciona bastante bien. Estamos utilizando Dapper para complementar algún código EntLib más antiguo, y las consultas simples son rápidas y sencillas. El mayor desafío fue lograr que Transactions funcionara correctamente. No menciona qué versión de EntLib está utilizando, pero 4.0 y las conexiones de gestión más nuevas dentro de TransactionScopes, por lo que si intenta abrir otra conexión para Dapper dentro de un ámbito con EntLib escalará automáticamente de una transacción local liviana a DTC (Coordinador de Transacciones Distribuidas). EntLib realmente no proporciona una forma de capturar la conexión abierta actual, por lo que debe derivar de la clase de Base de datos y exponer el método GetOpenConnection.

public class EntLibDatabaseWrapper : Database
{
    // ...Constructor and overrides...

    public IDbConnection GetMyOpenConnection()
    {
        var connectionWrapper = GetOpenConnection();
        return connectionWrapper.Connection;
    }
}

Luego utilízalo de la siguiente manera:

var db = DatabaseFactory.CreateDatabase();
var dbWrapper = new EntLibDatabaseWrapper(db.ConnectionString, db.DbProviderFactory);

using (var scope = new TransactionScope())
{
    var connection = dbWrapper.GetMyOpenConnection();

    try
    {
        var fooId = 
            connection.Query<int>("insert into Foo values (name = @name); select cast(scope_identity() as int", 
                                    new { name = "Foo" }).Single();
        var cmd =
            db.GetSqlStringCommand(
                "insert into Foo values (name = 'Bar'); select cast(scope_identity() as int)");
        var barId = int.Parse(db.ExecuteScalar(cmd));
        scope.Complete();
    }
    catch (Exception)
    {
        connection.Close();
        throw;
    }
}

Si tiene ámbitos de transacción más grandes, debe verificar si se encuentra en una transacción activa antes de cerrar cada conexión.

if(Transaction.Current == null)
     connection.Close();

Respuesta popular

¿Por qué usaría Enterprise Library si solo puede usar Dapper? En lugar de utilizar DataSets y DataReaders, puede ejecutar consultas, que devuelven objetos mapeados fuertemente tipados.



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é