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 を挿入して、ロールバックして希望どおりに処理できるようにすることです。それは私にはうまく合いませんし、ちょっと漏れているようです。
同じ問題を扱っている他の人はいますか?