1

IoC コンテナー (StructureMap) と Session per Call パターンの両方で WCF を使用するために、いくつかのコンポーネントを実装しました。NHibernate のものは、ここからほとんど取得されます: http://realfiction.net/Content/Entry/133

それは問題ないようですが、記事でどのように行われているかを示す Flush() だけでなく、呼び出しごとにトランザクションを開き、最後にコミットしたいと考えています。

ここで私はいくつかの問題に直面しており、いくつかのアドバイスを使用できます。ロールバックする良い方法がわかりませんでした。CommunicationState を確認でき、例外がある場合は次のようにロールバックできることがわかりました。

public void Detach(InstanceContext owner)
{
    if (Session != null)
    {
        try
        {
            if(owner.State == CommunicationState.Faulted)
                RollbackTransaction();
            else
                CommitTransaction();
        }
        finally
        {
            Session.Dispose();  
        }
    }
}

void CommitTransaction()
{
    if(Session.Transaction != null && Session.Transaction.IsActive)
        Session.Transaction.Commit();
}

void RollbackTransaction()
{
    if (Session.Transaction != null && Session.Transaction.IsActive)
        Session.Transaction.Rollback();
}

ただし、サービス コールから障害状態を返すことはほとんどありません。私は通常、例外を処理し、応答オブジェクトに適切なインジケーターを返し、トランザクションを自分でロールバックします。

これを処理する唯一の方法は、リポジトリを WCF サービスに挿入するだけでなく、ISession を挿入して、ロールバックして希望どおりに処理できるようにすることです。それは私にはうまく合いませんし、ちょっと漏れているようです。

同じ問題を扱っている他の人はいますか?

4

1 に答える 1

0

さらに検討した結果、これを処理する唯一の方法は、私のサービスに ISession を挿入することです。セッションは私のすべてのリポジトリに注入されたものと同じであり、WCF サービスはアプリケーション サービスであるため、サービスがトランザクションを管理できるようにすることは、実際にはリークや悪いことではないと判断しました。実際、それがアプリケーション サービスの全体的な目的です。つまり、インフラストラクチャとドメインの間の調整です。

この記事http://realfiction.net/Content/Entry/133の手法を使用することで、まだ多くの利点が得られます。自動トランザクションの開始/コミット/ロールバックを実装するつもりはありません。

于 2010-05-11T14:14:02.383 に答える