在我的 ASP.NET MVC 项目中,我有一个通过 Structuremap 实例化并配置为单例的类。
鉴于 ASP.NET 本质上是多线程的,并且单例模式默认情况下不是线程安全的,它会导致任何问题吗?
我遇到一个问题,即配置为单例的类返回多个实例。此问题是否是由于从不同线程请求实例所致。
编辑:对此问题给出了更详细的描述。Singleton 中的结构图返回多个实例 https://stackoverflow.com/questions/16732401/structuremap-in-singleton-returning-multiple-instances?noredirect=1#comment24116591_16732401
EDIT2:这是我的班级所做的描述
class DerviedClass: BaseInterface
{
ISession session
DerivedClass()
{
session = ObjectFactory.GetInstance<ISession>();
}
public bool DoWork
{
return session.QueryOver<MyTable>().RowCount() > 0;
}
}
考虑到您的扩展版本,示例DerviedClass
: 我想说,这是一个非常危险的事情,可能会导致很多问题。
我的担忧:
1) ASP.NET
+ NHibernate
== ISession
per Request。换句话说,当应用程序启动时(最有可能由第一个请求触发,如果自动重新启动,则触发的频率可能会更高),单例被创建并提供了一个实例ISession
per 当前请求 i.e 第一次请求.
好吧,至少,ISession
应该通过接收Factory
无论何时需要,可以肯定的是,它是当前请求有关的。
2) 如果 NHibernateISession
在构造函数中创建,旨在独立于当前请求,这可能意味着:
- 它长时间运行,在更多请求中打开且未关闭 - 可能存在锁定问题。或者
- 需要一些打开/关闭 ISession 管理,而不是基于当前请求
关键是,我在这里没有看到单例模式的好处。我们不需要也不提供通用的、要求独立的东西。
我们确实返回依赖于请求(及其会话范围)的数据。所以,我建议使用:
.HybridHttpOrThreadLocalScoped()
与逻辑生命周期使用的好处相比,为每个请求创建实例的开销根本不算什么。
但是,是的,这只是我的建议...因为我看到许多潜在的问题(锁定、意外更改、会话中可能提交的脏对象等)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)