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

时间:2012-11-28 18:11:22

标签: wcf nhibernate 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()));

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

工厂已经处理,无法再使用。 对象名称:'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();
            }
        }

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

请帮助!

1 个答案:

答案 0 :(得分:1)

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

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

我还在你的评论中读到你已经将ISession设置为单例。永远不应该这样做,因为它上面的任何一个故障你都会崩溃和烧毁你必须扔掉整个容器(最常见的是应用程序的组合根,所以你必须重新启动应用程序)

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

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


在您的情况下,似乎您的事务边界围绕WCF调用。你需要做的是取代ISession注册的生活方式。

如果你看一下NHibernateFacility的c'tor,你会找到一个通过瞬态生活方式的选项;如果所有组件都依赖于ISession是暂时的,那么在ISession上使用Transient生活方式会很好,因为只要从组合根/容器中取出对象,它就可以保证生存住。

“真正的”修复方法是扩展设施,从我的github扩展,在c'tor中使用枚举值获取PerWCFOperation值,并使设施注册ISessionManager和Func,这与三者的工作方式类似。现有的生活方式。