gpt4 book ai didi

.net - 使用 CaSTLe AutoTx Facility 和 NHibernate Facility 的交易

转载 作者:行者123 更新时间:2023-12-02 02:20:25 26 4
gpt4 key购买 nike

我正在尝试使用 Castle NHibernate Facility使用 AutoTx 工具。作为测试,我在服务中抛出一个异常,以确保事务被回滚。但是,数据仍然保存在数据库中。

我的服务接口(interface) 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 是一个注入(inject)的 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);

配置看起来相当简单,但我不知道我遗漏了什么。感谢您的帮助。

最佳答案

您没有显示服务实现类的类声明代码,因此您可能已经这样做了,但是如果您想要声明式事务,则需要使用 [Transactional] 注释事务类> 属性。

[Transactional]    
public class ActivityServiceImpl {

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

如果您不在实现类中包含 [Transactional] 属性,AutoTx 工具将不知道为该类创建包装器。

我倾向于将[Transaction] 属性放在实现方法上,而不是放在接口(interface)定义中。不知道对接口(interface)方法声明进行注解是否有效。

您可能还需要尝试一件事。我注意到当您配置容器时,您首先安装,然后添加 AutoTx 工具。我认为您应该在调用安装程序之前先添加这些设施。

关于.net - 使用 CaSTLe AutoTx Facility 和 NHibernate Facility 的交易,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8467246/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com