我正在尝试通过AutoTx工具使用Castle NHibernate Facility。作为测试,我在服务过程中抛出了一个异常,以确保事务被回滚。但是,数据仍然保存在数据库中。
我的服务接口,使用TransactionAttribute的IActivityService:
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);配置看起来相当简单,但是我不知道我遗漏了什么。谢谢你的帮助。
发布于 2011-12-15 09:53:46
您没有显示服务实现类的类声明代码,因此您可能已经这样做了,但是如果您想要声明性事务,则需要用[Transactional]属性注释transaction类。
[Transactional]
public class ActivityServiceImpl {
[Transaction]
public Activity CreateActivity(Activity activity) {
// ... implementation here
}
}如果在实现类上不包括事务性属性,则AutoTx工具不知道为该类创建包装器。
我倾向于将[Transaction]属性放在实现方法上,而不是放在接口定义中。我不知道注释接口方法声明是否有效。
还有一件事你可能需要尝试一下。我注意到,在配置容器时,您首先安装,然后添加AutoTx工具。我认为你应该在调用你的安装程序之前先添加工具。
https://stackoverflow.com/questions/8467246
复制相似问题