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

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

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

编辑:在这个问题上给出了更详细的描述。 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/

    10-12 12:43
    查看更多