c# - ASP.NET 多线程是否影响 Structuremap 单例类?

标签 c# thread-safety singleton structuremap

在我的 ASP.NET MVC 项目中,我有一个通过 Structuremap 实例化并配置为单例的类。

鉴于 ASP.NET 本质上是多线程的,单例模式默认情况下不是线程安全的,它会导致任何问题吗?

我遇到了一个问题,即为配置为 Singleton 的类返回多个实例。这个问题可能是因为从不同线程请求的实例。

编辑:关于这个问题给出了更详细的描述。 Structuremap in Singleton returning multiple instances

EDIT2:这是对我的类(class)做什么的描述

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请求。换句话说,当应用程序启动时(最有可能由第一个请求触发,如果自动重启到位则可能更频繁),将创建​​单例并为其提供 ISession< 的实例 每个当前请求,即第一个请求

至少,ISession 应该在需要时通过 Factory 接收,以确保它与当前请求 相关。

2) 如果在构造函数中创建的 NHibernate ISession 旨在独立于当前请求,则可能意味着:

  • 它长时间运行,在更多请求中打开但未关闭 - 可能存在锁定问题。或者
  • 需要一些打开/关闭 ISession 管理,而不是基于当前请求

重点是,我在这里看不到单例模式的好处。我们不需要也不提供通用的、要求独立的东西。

我们确实根据请求(及其 session 范围)返回数据。所以,我建议使用:

.HybridHttpOrThreadLocalScoped()

与逻辑生命周期使用的好处相比,为每个请求创建实例的开销是微不足道的。

但是,是的,这只是我的建议...因为我看到许多潜在的问题(锁定、非预期的更改、 session 中可能提交的脏对象等)

关于c# - ASP.NET 多线程是否影响 Structuremap 单例类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16919579/

相关文章:

java - 为什么Java Singleton需要防止反射攻击

c# - 无法将 Nullable<Int64> 分配给 Linq.Table.Max()?

c# - 在 Console.WriteLine 上使用三元运算符

java - 如果单例 getInstance() 方法未同步,Junit 测试将失败

java - JTextArea 的打字机效果

java - 阻止访问自己类中的特定属性

Java EE 单例反射注入(inject)

java - 我可以在 Java 中使用除法结果设置最终变量吗?

c# - 如何将 C# 6.0 添加到 Visual Studio 2013?

c# - EntityFramework CreatedOn 属性只能在 SaveChanges 方法中设置