工厂被废弃,不能再使用。 NHibernate设施
Posted
技术标签:
【中文标题】工厂被废弃,不能再使用。 NHibernate设施【英文标题】:The factory was disposed and can no longer be used. NHibernatefacility 【发布时间】:2012-11-16 16:41:03 【问题描述】:我已经尝试了三天来弄清楚这个 NHibernatefacility 与 Castle 和 wcf 的关系,它真的变得令人沮丧。
在解决了一大堆错误之后,我来到了这个看起来很明显但我无法解决的错误。
这是我 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'。
此行中我的用户存储库中发生错误
[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 岁的东西了。
请帮忙!
【问题讨论】:
您可以发布更多存储库代码吗?我不确定你为什么有一个会话方法(你的会话不应该被城堡注入吗?)。如果它实际上是一个生活方式问题,那么查看存储库中的 dispose 方法也会很有用。 你好安德鲁。我只是在关注文档。 session 是一个 Func很抱歉之前没有找到这个问题。
您收到此错误消息的最可能原因是您正在重新注册 ISession。该设施的重点是为您提供支持。
我还在您的评论中读到您已将 ISession 设置为单例。永远不应该这样做,因为它上面的任何单个故障都会崩溃并烧毁,并且您必须丢弃整个容器(通常是应用程序的组合根,因此您必须重新启动应用程序) .
该工具的重点是为您提供基于 AOP 的事务,然后您需要让您的事务尽可能接近 GUI 或命令层。子操作(例如读取)不应包含在带有 [Transaction]
的单个事务中,因为它们不表示您的操作的事务边界。
相反,请查看您的表面 API,看看您在哪里调用了应该使用 ACID 运行的方法;这是你放置属性的地方。
在您的情况下,您的事务边界似乎围绕 WCF 调用。您需要做的是替换 ISession 注册的生活方式。
如果您查看 NHibernateFacility 的 c'tor,您会发现可以通过短暂的生活方式;如果依赖于 ISession 的所有组件都是瞬态的,那么您最好在 ISession 上使用瞬态生活方式,因为它保证只在从组合根/容器中获取的对象的时间内存活生活。
“真正的”修复是从我的 github 扩展设施,在 c'tor 中使用一个枚举来获取 PerWCFOperation 值,并让设施注册 ISessionManager 和 Func ,类似于它对三个现有的生活方式。
【讨论】:
你好亨利克。我向您的电子邮件发送了我的项目的“副本”以及我如何实施您的设施。当你检查它时让我知道,这样我们就可以在这里向其他人发布解决方案。非常感谢。 老实说,你的最后一段在我的脸上放了一张“困惑的脸”....看起来并不复杂,我根本无法弄清楚。 您好,我还没有时间浏览您的代码。我们在这里谈论对象的生活方式。检查对于需要事务的给定对象,它所依赖的所有事物都是瞬态的,并确保您将其作为 WCF 操作的横切关注点的一部分来解决和释放。这就是 PerWCFOperation 所做的,但是如果您在 WCF 操作中打开事务,那么该事务将在您的 WCF 操作结束之前处理其已解决的项目,然后您将收到错误消息。 你好亨利克。我明白。任何帮助将不胜感激。我找到了这篇文章。你认为这有什么帮助吗?起点?我对大部分文章的唯一担心是它们太旧了。 richarddingwall.name/2010/08/17/… 让我知道您对此的看法。谢谢以上是关于工厂被废弃,不能再使用。 NHibernate设施的主要内容,如果未能解决你的问题,请参考以下文章
NHibernate 2.1 代理工厂选项 - 有啥区别以及选择哪个?
在 NHibernate 中,我可以使用工厂来构建复杂的聚合对象(实体)吗?
kotlin-android-extensions插件被废弃--解决办法
Castle Windsor 3 + Fluent NHibernate + Castle.NHibernate.Integration