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を使用すると、TransactionScope の代わりに使用する必要があるADO.NET の raw クラスIDbConnectionとクラスにアクセスできます。拡張メソッドIDbTransactionを使用してトランザクションを作成できます。例: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();
    }
}

必要なコードが少ないため、プロパティ インジェクションを好み、LazyDbプロパティを使用してメソッドのデータ アクセス パターンを簡素化します。

注: クラスのいずれかがオープンへの参照を保持している場合IDbConnection(この例のように)、使用後に接続が破棄されるように、None/TransientまたはRequestScopeに登録する必要があります (つまり、シングルトンとして登録しないでください)。

于 2013-02-20T04:59:07.263 に答える