C# ASP.NET多线程是否影响Structuremap singleton类?

C# ASP.NET多线程是否影响Structuremap singleton类?,c#,thread-safety,singleton,structuremap,C#,Thread Safety,Singleton,Structuremap,在我的ASP.NET MVC项目中,我有一个通过Structuremap实例化并配置为单例的类 鉴于ASP.NET本质上是多线程的,并且默认情况下Singleton模式不是线程安全的,它会导致任何问题吗 我遇到了一个问题,一个配置为Singleton的类返回了多个实例。这个问题可能是因为从不同的线程请求了实例 编辑:关于这个问题有更详细的描述 EDIT2:下面是对我们班的描述 class DerviedClass: BaseInterface { ISession session

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

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

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

编辑:关于这个问题有更详细的描述

EDIT2:下面是对我们班的描述

class DerviedClass: BaseInterface
{
   ISession session

   DerivedClass()
   {
      session = ObjectFactory.GetInstance<ISession>();
   }

   public bool DoWork
   {
       return session.QueryOver<MyTable>().RowCount() > 0;
   }
}
类DerviedClass:BaseInterface
{
休会期
派生类()
{
session=ObjectFactory.GetInstance();
}
公共场所
{
返回session.QueryOver().RowCount()>0;
}
}

必须确保每个属性集块都使用锁,以确保单例线程的安全,如下所示:

public int Counter
{
    get { return _counter; }

    set
    {
        lock(_counterLock)
        {
            _counter = value;
        }
    }
}

private int _counter = 0;

private object _counterLock = new Object();

考虑到您的扩展版本,
DerviedClass
:我想说,这是一个非常危险的问题,可能会导致很多问题

我关注的是:

1) ASP.
NET
+
NHibernate
==
ISession
每个请求。换句话说,当应用程序启动时(最有可能由第一个请求触发,如果自动重新启动ar,这可能会更频繁),将创建单例并为每个当前请求(即第一个请求)提供一个
ISession
实例

至少,只要需要,
i会话
就应该通过
工厂
接收,以确保它与当前请求相关

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

  • 它长时间运行,在多个请求中打开而不是关闭-可能存在锁问题。或
  • 需要一些打开/关闭会话管理,而不是基于当前请求
关键是,我看不到单例模式的好处。我们不需要也不提供普通的、要求独立的东西

我们确实返回依赖于请求(及其会话范围)的数据。因此,我建议使用:

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


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

它不是一个单例类。它是在StructureMap中配置为Singleton的常规类。关于我的设置的更多数据-请您提供一些详细信息“singleton”为您做了什么?如果只有读取方法(获取本地化字符串、获取用户列表、返回元数据、返回ValidationRules集——这是我的方法),那么singleton就不是问题。如果它要执行任何写操作,“perthread实例”可能是正确的选择。如果可能,请扩展问题的目的。StructureMap是线程安全的,但是如果在多线程应用程序中返回某个类的单个实例,则该类本身必须是线程安全的。我的类不是singleton。通过ObjectFactory的配置使其成为单例。我已经对问题进行了编辑,以包含更多细节(at)。如果它作为一个单例管理,那么事实上它是一个单例,不是吗?有一个实例是所有人共享的,因此必须使用上面的方法使其成为线程安全的。但是类本身没有私有构造函数。structureMap在第一次请求时缓存实例。我不确定这是否也需要线程安全代码。我会尝试一下的。因为只有一个实例,不管你怎么看,所有的线程都会通过这个实例,你的代码必须是线程安全的。嗨,Radim,谢谢你的想法。实现一个返回静态数据的服务的理想方式是什么?在应用程序的整个生命周期中,静态数据不会改变。由于这些数据没有改变,我希望不必对数据库进行多次查询。实现这一点最简单的方法是使用静态,但我不想失去可测试性,因此我选择了单例,