Dapperをエンタープライズライブラリに追加しますか?

.net dapper enterprise-library orm

質問

私たちは標準DALとしてエンタープライズライブラリを使用しています。さて、私はDapperのメリットを享受したいと思います。実装を見ると、接続クラスを拡張するだけです。

Dapperをエンタープライズライブラリを拡張するように設定して、両方の世界を楽しむことが考えられますか?または、誰かがすでにこれを作成していますか?

受け入れられた回答

はい、それは考えられ、それはかなりうまくいきます。私たちはいくつかの古いEntLibコードを補うためにDapperを使用しています。簡単なクエリは素早く簡単です。最大の課題は、トランザクションを適切に動作させることでした。あなたは使用しているEntLibのバージョンは言及していませんが、4.0以降ではTransactionScopesの内部で接続を管理します。したがって、EntLibでスコープ内のDapperの別の接続を開こうとすると、軽量ローカルトランザクションからDTC (分散トランザクションコーディネータ)。 EntLibは現在のオープン接続を取得する方法を提供していないため、Databaseクラスから派生してGetOpenConnectionメソッドを公開する必要があります。

public class EntLibDatabaseWrapper : Database
{
    // ...Constructor and overrides...

    public IDbConnection GetMyOpenConnection()
    {
        var connectionWrapper = GetOpenConnection();
        return connectionWrapper.Connection;
    }
}

次に、次のようなものを使用します。

var db = DatabaseFactory.CreateDatabase();
var dbWrapper = new EntLibDatabaseWrapper(db.ConnectionString, db.DbProviderFactory);

using (var scope = new TransactionScope())
{
    var connection = dbWrapper.GetMyOpenConnection();

    try
    {
        var fooId = 
            connection.Query<int>("insert into Foo values (name = @name); select cast(scope_identity() as int", 
                                    new { name = "Foo" }).Single();
        var cmd =
            db.GetSqlStringCommand(
                "insert into Foo values (name = 'Bar'); select cast(scope_identity() as int)");
        var barId = int.Parse(db.ExecuteScalar(cmd));
        scope.Complete();
    }
    catch (Exception)
    {
        connection.Close();
        throw;
    }
}

トランザクションスコープが大きい場合は、各接続を閉じる前にアクティブなトランザクションになっているかどうかを確認する必要があります。

if(Transaction.Current == null)
     connection.Close();

人気のある回答

Dapperのみを使用できるのであれば、なぜエンタープライズライブラリを使用しますか? DataSetsおよびDataReaderを使用する代わりに、厳密に型指定されたマップされたオブジェクトを返すクエリを実行できます。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow