我正在嘗試將Castle NHibernate Facility與AutoTx設施配合使用。作爲測試,我在服務中間拋出一個異常,以確保事務回滾。但是,數據仍然保留在數據庫中。使用城堡AutoTx設施和NHibernate設施的交易
我的服務接口,IActivityService
使用TransactionAttribute:
public interface IActivityService
{
[Transaction]
Activity CreateActivity(Activity activity);
}
的CreateActivity
實施。我在這裏拋出一個異常,預計在AddActivity
添加的數據回滾:
public virtual Activity CreateActivity(Activity activity)
{
activityDAO.AddActivity(activity);
throw new Exception("This should rollback the transaction");
return activity;
}
的AddActivity
實現。 SessionManager
是注入的ISessionManager
。
public void AddActivity(Activity activity)
{
using (ISession session = SessionManager.OpenSession())
{
session.Save(activity);
}
}
最後,這裏是我如何配置windsor容器。該NHibernateInstaller
是直接從the guide,用我的功能NHibernate配置交換:
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);
的配置似乎相當簡單,但我想不出什麼我失蹤。謝謝你的幫助。
啊,你說的對,有兩點,謝謝!我必須在調用安裝程序之前添加這些設施,並且'[Transaction]'必須在實現中。只是一個側面說明,'[Transactional]'屬性已被棄用(我正在運行Castle.Services.Transaction.3.0.202.2202);沒有它就能正常工作。 – Will