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

我的服务接口, 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直接来自指南 ,我的流畅的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);

配置似乎相当简单,但我无法弄清楚我错过了什么。 谢谢你的帮助。

===============>>#1 票数:1

首先,您必须在会话管理器和活动服务之间具有直接依赖关系。 应将会话管理器注入活动服务。 只有在这种情况下,工具才会影响NHibernate事务。

[Transactional]
    public class ActionService : IActionService
    {
        private ISessionManager _sessionManager;

        [Transaction]
        public void AddActivity(Activity activity)
        {
            using (ISession session = _sessionManager.OpenSession())
            {
                using (ITransaction tran = session.BeginTransaction())
                {
                        session.Save(activity);
                    tran.Commit();
                }
            }       
        }
        public ActionService(ISessionManager sessionManager)
    {
            _sessionManager = sessionManager;       
        }
    }
    _container.Register(Component.For<IActionService>()
            .ImplementedBy<ActionService>.LifestylePerWebRequest());

还要检查是否对SessionManager,Server,DAO和其他依赖对象使用相同的生活方式。

===============>>#2 票数:1 已采纳

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

[Transactional]    
public class ActivityServiceImpl {

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

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

我倾向于将[Transaction]属性放在实现方法上,而不是在接口定义中。 我不知道它是否有效地注释接口方法声明。

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

  ask by Will translate from so

未解决问题?本站智能推荐:

1回复

c#-可以在.Net v3.5上使用Castle.Facilities.NHibernate吗?

我正在使用Windsor和NHibernate开发ASP.NET应用程序。 我想使用Castle的新NHibernateFacility,但我受困于.NET 3.5,而NHibernateFacility和AutoTx仅针对.NET 4。 在v3.5上重新编译它们安全吗? 如果不是,是
1回复

使用Nhibernate工具配置Castle Windsor容器和Nhibernate

我正在尝试使用Nhibernate设施使用Castle Windsor Container配置Nhibernate。 但是我有 这是我的web.config 并且在我的global.asax中添加了以下几行 但是我收到以下错误 * 未为指定的别名映射ISession
1回复

在Castle Core 1.2中使用Castle NHibernate集成工具

我正在做一个个人学习项目,以帮助我了解如何使用温莎城堡和Fluent NHibernate。 到目前为止,编写了一个ASP.NET MVC项目,该项目将服务的一些基本依赖项注入到控制器中。 我的项目包含以下参考: 我设法从Active Record项目中获取NHibernate.
1回复

您在哪里下载NHibernate Castle Facility?

我知道这似乎是一个愚蠢的问题,但从城堡项目页面/文档中并不清楚。 我需要一个与NHibernate(2.1.2)的最新版本兼容的版本。 我应该从github主干中获取最新资源并进行构建,还是应该从其他地方获得它?
2回复

NHibernate Castle Facility的延迟加载

我一定要关闭ISession由岛城产生的ISessionManager的NHibernate的? 如何处理与这些ISession的事务? 我还是NHibernate的新手。 编辑:我想延迟加载,但我收到此消息: 初始化[未能延迟初始化角色的集合:,没有会话或会话被关闭“
1回复

使用Castle Windsor和NHibernate工具将正确的ISessionFactory注入IRepository

我有三个SQL Server数据库,单个应用程序可从中检索数据。 我正在使用NHibernate从不同的数据库检索数据。 我已经进行了设置,以便每个数据库在自己的程序集中都有自己的存储库和类映射。 在我的castle.config文件中,我使用Castle NHibernate工具设置了数
2回复

NHibernate(3.1.0.4000)使用Query <>和NHibernate Facility的NullReferenceException

我有NHibernate的问题,我似乎无法找到任何解决方案。 在我的项目中,我有一个简单的实体(批处理),但每当我尝试运行以下测试时,我都会遇到异常。 我已经尝试了几种不同的方法来执行类似的查询,但几乎所有的异常(它与执行的LINQ方法不同)。 第一次测试: 例外: 第
2回复

是否有人设法写一个流畅的版本来添加Castle NHibernate Facility?

有没有人设法做到这一点? 基本上我正在寻找以下内容: 和相应的代码来安装它是 其中,Windsor.config是上面的xml。 流利的形式 通常,您可以做类似的事情 但是,从Intellisense中的选项来看,尚不清楚是否有任何内容可以从上面的xml
1回复

为什么要使用CastleWindsor NHibernate工具中的ISessionManager?

我是NHibernate和Castle Windsor的初学者,但是我正在处理的当前应用程序是使用Castle Windsor的NHibernate设施集成级别2,即使用ISessionManager。 我已经比较了需要手动保留数据和使用ISessionManager所需执行的操作,但我并
1回复

如何通过C#代码而不是xml配置“ Windsor NHibernate Facility”?

我最近尝试将Castle Windsor和Nhibernate Facility与我的旧有旧项目集成,请遵循doc( http://docs.castleproject.org/Windsor.NHibernate-Facility.ashx )。 但是我想知道是否有一种方法可以通过C#