将Dapper添加到企业库?

时间:2012-07-26 18:14:18

标签: .net orm enterprise-library dapper

我们使用企业库作为标准DAL。现在,我想享受Dapper的好处。查看实现,它只是扩展连接类。

是否可以设置Dapper扩展企业库,以便我们可以享受这两个世界? 或者有人已经创建了这个?

2 个答案:

答案 0 :(得分:5)

是的,可以想象,而且效果很好。我们使用Dapper来补充一些旧的EntLib代码,简单的查询快速而轻松。最大的挑战是让交易正常运作。您没有提到您正在使用哪个版本的EntLib,而是在事务监视器内部使用4.0和更新的管理连接,因此如果您尝试使用EntLib为范围内的Dapper打开另一个连接,它将自动从轻量级本地事务升级到DTC (分布式事务协调器)。 EntLib实际上并没有提供一种获取当前打开连接的方法,因此您必须从Database类派生并公开GetOpenConnection方法。

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

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

然后使用类似这样的东西:

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

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

    try
    {
        // Insert a test value using dapper
        var fooId = 
            connection.Query<int>("insert into Foo values (name = @name); select cast(scope_identity() as int", 
                                    new { name = "Foo" }).Single();
        // Insert a test value using Enterprise Library
        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;
    }
}

如果您有更大的交易范围,那么在关闭每个连接之前,您必须检查您是否处于活动交易中。

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

答案 1 :(得分:2)

如果只能使用Dapper,为什么要使用Enterprise Library?您可以执行查询,而不是使用DataSet和DataReader,这些查询返回强类型映射对象。