工厂处理完毕,无法再使用.NHibernatefacility

Pep*_*dez 6 nhibernate wcf castle-windsor isession

我已经尝试了三天用Castle和wcf弄清楚这个NHibernatefacility的事情,它真的让人很沮丧.

在解决了十几个错误之后,我来到了这个看起来非常明显但我无法解决的问题.

这是我的global.asax的Application_Start

        container.AddFacility<AutoTxFacility>();
        container.Register(Component.For<INHibernateInstaller>().ImplementedBy<NHibernateInstaller>());
        container.AddFacility<NHibernateFacility>();
        container.AddFacility<WcfFacility>();

        container.Register(
            Component.For<IAuthService>().ImplementedBy<AuthService>().LifestylePerWcfOperation(),
            Component.For<IUserRepository>().ImplementedBy<UserRepository>().LifestylePerWcfOperation(),
            Component.For<IActionWebService>().ImplementedBy<ActionWebService>().Named("ActionWebService").LifestylePerWcfOperation(),
            Component.For<ISession>().LifeStyle.PerWcfOperation().UsingFactoryMethod(x => container.Resolve<ISessionManager>().OpenSession()));
Run Code Online (Sandbox Code Playgroud)

这适用于第一个请求.之后,它出现了这个错误.

工厂处理完毕,无法再使用.对象名称:'this'.

错误发生在我的userrepository中

[Transaction]
        public virtual User GetUserByCredentials(string email, string password)
        {
            using (var tx = session())
            {
                return tx.QueryOver<User>().Where(x => x.Email == email && x.Password == password).SingleOrDefault();
            }
        }
Run Code Online (Sandbox Code Playgroud)

我感觉这与LIfestyle有关.我尝试了多种组合但不成功.我不知道该做什么.我进入这个城堡的东西有所有的设施(应该让生活更轻松),由于缺乏文件,它真的很复杂.我无法找到一个下降指南来实现所有这些,更不用说一些不是4年的东西了.

请帮忙!

Hen*_*rik 1

抱歉之前没有找到这个问题。

您收到此错误消息的最可能原因是您正在重新注册 ISession。该设施的目的是为您提供支持。

我还在您的评论中读到您已将 ISession 设置为单例。永远不应该这样做,因为它的任何一个错误都会导致崩溃和烧毁,并且您将不得不扔掉整个容器(最常见的是应用程序的组合根,因此您必须重新启动应用程序) 。

该设施的重点是为您提供基于 AOP 的事务,然后您需要让事务尽可能接近 GUI 或命令层。子操作(例如读取)不应包含在单个事务中,[Transaction]因为它们不表示操作的事务边界。

相反,查看你的表面 API,看看在哪里调用了应该使用 ACID 运行的方法;这是放置属性的地方。


就您而言,您的事务边界似乎围绕着 WCF 调用。您需要做的是替换 ISession 注册的生活方式。

如果您查看 NHibernateFacility 的 c'tor,您会发现一个传递短暂生活方式的选项;如果依赖于 ISession 的所有组件都是瞬态的,那么您最好在 ISession 上采用瞬态生活方式,因为它保证只在从组合根/容器中获取的对象存在时存在。

“真正的”修复是从我的 github 扩展该设施,在 c'tor 中使用一个枚举来获取 PerWCFOperation 值,并让该设施用这些值注册 ISessionManager 和 Func,类似于它对三种现有生活方式的处理方式。