在使用ServiceStack.ORMLite Repository模式交易(Transaction

2019-08-17 01:44发布

我执行使用ServiceStack.ORMLite这样Repository模式:

public class MyRepository : IMyRepository
{
    private IDbConnectionFactory DbConnectionFactory = null;

    public MyRepository(IDbConnectionFactory dbConnectionFactory)
    {
        DbConnectionFactory = dbConnectionFactory;
    }

    public void MyMethod()
    {
        using (var connection = DbConnectionFactory.OpenDbConnection())
        using (var cmd = connection.CreateCommand())
        {
            //Do something here
        }
    }
}

但我不知道如何处理DbTransaction当我需要一些扭曲DB操作在DbTransaction.It貌似TransactionScope是一个解决方案,但我不知道是否是太沉重了这一点。

Answer 1:

ServiceStack OrmLite ,您可以访问ADO.NET的原始IDbConnectionIDbTransaction你应该使用它来代替的TransactionScope的类。 您可以通过创建一个事务IDbConnection.OpenTransaction()扩展方法,如:

public class MyRepository : IMyRepository, IDisposable
{
    private IDbConnectionFactory DbFactory { get; set; }

    private IDbConnection db;
    private IDbConnection Db
    {
        get { return db ?? (db = dbFactory.Open()); }
    }

    public void WithTransactions()
    {
        using (var trans = Db.OpenTransaction())
        {
            //Do something here

            trans.Commit();
        }
    }

    public List<Poco> WithoutTransactions()
    {
        return Db.Select<Poco>();
    }

    public void Dispose()
    {
        if (db != null) 
            db.Dispose();
    }
}

因为它需要较少的代码,我宁愿财产注射和使用懒惰Db特性,以简化数据访问模式为我的方法。

注:每当任何类中保持一个开放的参考IDbConnection (像这样),应该用无/瞬态RequestScope所以连接被使用后丢弃(即不注册为单身)注册。



Answer 2:

我喜欢这里mythz回答但遇到一些麻烦自己把事情如我所期望的基础上mythz反馈工作。 我碰到这个对方的回答是,在第一,似乎没有什么我一直在寻找,但真的结束了把我在正确的方向跑去。

使用ServiceStack.ORMLite执行工作的单位和存储库模式的最佳实践



文章来源: Transactions in the Repository Pattern using ServiceStack.ORMLite