2

主要使用 Enterprise Library Data Access Application Block后,我习惯了它能够在环境事务范围内为给定的连接字符串保持单个打开的连接。它使用类DatabaseDatabaseConnectionWrapperTransactionScopeConnections来做到这一点。

Database 类要么获取与环境事务关联的当前连接,由 DatabaseConnectionWrapper 包装,并通过 TransactionScopeConnections.GetConnection 增加包装器的引用计数器(静态成员),要么创建一个新的打开连接。释放 ConnectionWrapper 时,引用计数器递减,直到引用计数为零时才释放连接。因此,每个 Repository 方法都可以获得一个打开的连接,而不必担心在 TransactionScope 内创建多个连接,这会导致提升为分布式事务。

OrmLite 的 OrmLiteConnectionFactory 内部是否有类似的功能或首选的使用模式,或者我是否需要使用连接过滤器和连接工厂的 OnDisposing 事件的组合来推出自己的功能?

使用示例。请注意,事务中涉及两个不同的数据库。

using System;
using ServiceStack.OrmLite;
using System.Transactions;
using Dapper;
using System.Data;

public abstract class Repository
{
    public IDbConnectionFactory ConnectionFactory { get; set; }
}

public class Repository1:Repository
{
    public void UpdateSomething(int id, string value)
    {
        using (var connection = ConnectionFactory.Open("Db1"))
        {
            connection.Execute("proc1", new { id = id, value = value }, commandType: CommandType.StoredProcedure);
        };
    }
}

public class Repository2:Repository
{
    public void UpdateSomethingElse(int id, string value)
    {
        using (var connection = ConnectionFactory.Open("Db1"))
        {
            connection.Execute("proc2", new { id = id, value = value }, commandType: CommandType.StoredProcedure);
        };
    }
}

public class Repository3:Repository
{
    public void UpdateYetSomethingElse(int id, string value)
    {
        using (var connection = ConnectionFactory.Open("Db2"))
        {
            connection.Execute("proc3", new { id = id, value = value }, commandType: CommandType.StoredProcedure);
        };        
    }
}


public class BusinessObject
{
    public int Id { get; set; }
    public string Value { get; set; }

    public void Save()
    {        
        using (TransactionScope scope = new TransactionScope())
        {
            new Repository1().UpdateSomething(Id,Value);
            new Repository2().UpdateSomethingElse(Id, Value);
            new Repository3().UpdateYetSomethingElse(Id, Value);
        }
    }
}
4

0 回答 0