【问题标题】:Add Dapper to Enterprise Library?将 Dapper 添加到企业库?
【发布时间】:2012-07-26 18:14:17
【问题描述】:

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

是否可以将 Dapper 设置为扩展 Enterprise Library 以便我们可以享受这两个世界? 或者也许有人已经创建了这个?

【问题讨论】:

    标签: .net orm enterprise-library dapper


    【解决方案1】:

    是的,这是可以想象的,而且效果很好。我们使用 Dapper 来补充一些较旧的 EntLib 代码,简单的查询既快速又轻松。最大的挑战是让事务正常工作。您没有提及您使用的是哪个版本的 EntLib,但 4.0 和更新的版本管理 TransactionScopes 内的连接,因此如果您尝试使用 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();
    

    【讨论】:

    • DTC 上的“升级为 DTC”是什么意思?
    • 抱歉,对缩写有点不知所措。如果您在 System.Transactions 事务范围内打开多个连接,ADO.NET 将(默认情况下)自动从本地轻量级事务切换到使用分布式事务协调器来管理事务。您必须确保 DTC 服务正在运行并且可以访问。如果您在现有连接中手动登记您的事务,则可以避免 DTC 开销。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-06
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多