6

三天来,我一直在尝试用 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()));

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

工厂被废弃,不能再使用。对象名称:“这个”。

错误发生在我的用户存储库中的这一行

[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();
            }
        }

我感觉这与生活方式有关。我尝试了多种组合但不成功。我现在不知道该怎么办。我带着所有的设施(应该让生活更轻松)进入了这座城堡,由于缺乏文档,这真的很复杂。我还没有找到一个下降指南来一起实现所有这些,更不用说那些不到 4 岁的东西了。

请帮忙!

4

1 回答 1

1

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

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

我还在您的评论中读到您已将 ISession 设置为单例。永远不应该这样做,因为它上面的任何单个故障都会崩溃并烧毁,并且您必须丢弃整个容器(通常是应用程序的组合根,因此您必须重新启动应用程序) .

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

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


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

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

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

于 2012-12-28T20:32:30.693 回答