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

Swo*_*ker 9 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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我需要在DbTransaction中扭曲一些数据库操作时,我不知道如何处理DbTransaction.它看起来像是TransactionScope一个解决方案,但我不知道这是否太重了.

myt*_*thz 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

注意:每当您的任何类都保持对open IDbConnection(如此)的引用时,它应该使用None/TransientRequestScope注册,以便在使用后将连接丢弃(即不将其注册为单例).

  • 你没有正当理由去思考这个问题.如果长时间运行的连接需要多次访问db,那么你打算做什么?在同一请求中多次重新打开数据库连接?如何打开新连接比重新使用现有连接更好?好像你不了解连接池或多线程,不要过分思考这个,答案是使用Transient或RequestScope.但是如果你的偏执狂,每次你在你的例子中做的时候都可以随意明确地打开和关闭连接. (3认同)