3

我的应用程序使用 NHibernate 和每个请求实现的会话。我有一个核心库,它提供了一个线程安全的单例来访问当前的休眠会话。

该单例在 BeginRequest 和 EndRequest 事件中从 Web 应用程序中得到利用,以确保每个请求都打开和关闭会话。此外,我的 DataAccess 层使用相同的单例来执行数据访问,以便利用相同的休眠会话。

我现在将 Ninject 添加到等式中,以便我可以在运行时推断 NHibernate 上下文信息,即连接字符串。我想更改我的网络配置中的一个值,告诉它它将访问哪个数据库。问题是,为了做到这一点,我需要我的单例(上面提到的)能够推断出它的一个属性,IConnectionStringProvider。

它连接正确,但单例永远不会有实例化的属性,因此,一切都会中断。

所以,对于我的问题......我怎样才能让 Ninject 与单例一起工作,或者我怎样才能改变我的实现以与 Ninject 一起工作?

4

2 回答 2

2

也许您可以尝试将单例绑定到像这样的常量

Bind<ISession>().ToConstant(SessionSingleton.Instance);

我使用 Settings 对象的 Settings.Default 单例来执行此操作(主要是作为补丁方法,直到我有时间真正使用我的设置)并且效果很好。

于 2009-08-21T00:10:29.270 回答
1

这是很多人在使用单例时遇到的常见问题。虽然我不能具体评论 NHibernate,但请查看Misko 的文章,了解为什么单例设计模式会遇到您所描述的问题。请务必阅读评论和链接文章以了解如何处理(或在 google 上搜索“单身人士都去哪儿了?”)。

如果你对这个话题感兴趣,你可能还想用谷歌搜索“singleton-i-love-you-but-youre-bringing-me-down”

希望这会有所帮助。

于 2009-08-20T21:00:59.420 回答