9

我正在使用 ServiceStack.ORMLite 实现存储库模式,如下所示:

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。它看起来TransactionScope是一个解决方案,但我不知道这是否太重了。

4

2 回答 2

9

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(如这个)时,它应该注册为None/TransientRequestScope以便在使用后处理连接(即不要将其注册为单例)。

于 2013-02-20T04:59:07.263 回答
1

我喜欢 mythz 的回答,但是根据 mythz 的反馈,我自己在让事情正常工作时遇到了一些麻烦。我遇到了另一个答案,起初,它似乎不是我想要的,但最终让我朝着正确的方向前进。

使用 ServiceStack.ORMLite 实现工作单元和存储库模式的最佳实践

于 2013-10-03T17:44:30.240 回答