3

Castle NHibernate ファシリティを AutoTx ファシリティで使用しようとしています。テストとして、トランザクションがロールバックされることを確認するために、サービスの途中で例外をスローしています。ただし、データは引き続きデータベースに保持されます。

IActivityServiceTransactionAttribute を使用した私のサービス インターフェイス:

public interface IActivityService
{
    [Transaction]
    Activity CreateActivity(Activity activity);
}

の実装CreateActivityAddActivity追加されたデータがロールバックされることを期待して、ここで例外をスローしています。

public virtual Activity CreateActivity(Activity activity)
{
    activityDAO.AddActivity(activity);
    throw new Exception("This should rollback the transaction");
    return activity;
}

の実装AddActivitySessionManager注入されISessionManagerた です。

public void AddActivity(Activity activity)
{
    using (ISession session = SessionManager.OpenSession())
    {
        session.Save(activity);
    }
}

最後に、windsor コンテナーを構成する方法を次に示します。これは、流暢な nhibernate 構成がスワップインされた、ガイドNHibernateInstallerからそのままです。

container = new WindsorContainer().Install(FromAssembly.This());

// set up ISessionManager injection for DAOs
container
    .AddFacility<AutoTxFacility>()
    .Register(Component
        .For<INHibernateInstaller>()
        .ImplementedBy<NHibernateInstaller>()
        .LifeStyle.Singleton)
    .AddFacility<NHibernateFacility>(f => 
        f.DefaultLifeStyle = DefaultSessionLifeStyleOption.SessionPerWebRequest);

構成はかなり単純に見えましたが、何が欠けているのかわかりません。助けてくれてありがとう。

4

2 に答える 2

1

サービス実装クラスのクラス宣言コードを示していないため、すでにこれを行っている可能性がありますが、宣言型トランザクションが必要な場合は、トランザクション クラスに[Transactional]属性で注釈を付ける必要があります。

[Transactional]    
public class ActivityServiceImpl {

    [Transaction]
    public Activity CreateActivity(Activity activity) {
        // ... implementation here
    }
}

実装するクラスに [Transactional] 属性を含めない場合、AutoTx 機能はクラスのラッパーを作成することを認識しません。

[Transaction]インターフェイス定義ではなく、実装メソッドに属性を配置する傾向があります。インターフェイスメソッド宣言に注釈を付けて機能するかどうかはわかりません。

もう 1 つ、試してみる必要があるかもしれません。コンテナーを構成するときは、最初にインストールしてから、AutoTx 機能を追加していることに気付きました。インストーラーを呼び出す前に、最初に機能を追加する必要があると思います。

于 2011-12-15T01:53:45.943 に答える