使用ServiceStack.ORMLite在存储库模式中的事务

时间:2013-02-20 03:26:16

标签: repository-pattern servicestack ormlite-servicestack

我正在使用ServiceStack.ORMLite实现Repository Pattern,如下所示:

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中扭曲一些数据库操作时,我不知道如何处理DbTransaction。看起来TransactionScope是一个解决方案,但我不知道这是否太重了。

2 个答案:

答案 0 :(得分:10)

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();
    }
}

由于它需要更少的代码,我更喜欢属性注入,并使用Lazy Db属性来简化我的方法的数据访问模式。

注意:每当您的任何课程引用开放式IDbConnection(如此)时,应使用无/瞬态 RequestScope 因此连接在使用后被丢弃(即不将其注册为单例)。

答案 1 :(得分:0)

我喜欢这里的mythz答案,但是根据mythz的反馈意见,我自己也会遇到一些麻烦。我碰到了另一个答案,起初,似乎不是我想要的,但真的最终让我朝着正确的方向前进。

Best practices of implementing unit of work and repository pattern using ServiceStack.ORMLite