【问题标题】:HttpContext like ObjectHttpContext 类似对象
【发布时间】:2011-01-13 08:43:24
【问题描述】:

我喜欢 HTTPContext.Current 的工作方式。有什么方法可以实现与 HTTPContextBase 无关的类似对象?基本上,我想创建一个 UserContext。然后在 DAL 中,我可以简单地查询这个 UserContext 以获取特定于用户的信息。该对象必须是线程安全的,并且可以在 ASP.NET 环境(因此 THREAD STATIC 属性不起作用)和控制台/库环境中工作。

【问题讨论】:

  • 为什么[ThreadStatic] 不起作用?
  • ThreadStatic 不起作用,因为如果它在 ASP.NET 环境中,可能会发生线程切换。
  • 在 ASP.NET 中,您当前所在的工作线程也可用于其他请求。 “在 ASP.NET 中,您的代码在默认 ASP.NET 工作线程池中的 25 个左右线程的 WorkerThread 上运行,并且您认为“对您的线程个人私有”的变量是个人私有的……对您和此工作线程处理过的所有其他请求。”
  • 您可以在请求完成后清除该字段。
  • piers7.blogspot.com/2005/11/… 应该弄清楚为什么在 ASP.NET 中使用 [ThreadStatic] 不好

标签: c# .net asp.net architecture


【解决方案1】:

HttpContext.Current 是一个单例。线程安全的实现是这样的:

using System;

public sealed class Singleton
{
   private static volatile Singleton instance;
   private static object syncRoot = new Object();

   private Singleton() {}

   public static Singleton Current
   {
      get 
      {
         if (instance == null) 
         {
            lock (syncRoot) 
            {
               if (instance == null) 
                  instance = new Singleton();
            }
         }

         return instance;
      }
   }
}

但是使用单例模式并不是一个好主意。这几乎是“反模式”。这阻碍了单元测试。而不是这个更好的使用依赖注入容器。 http://en.wikipedia.org/wiki/Dependency_injection

【讨论】:

  • 很好的答案。我想按照这些思路发布一些内容,但不知道该怎么说。
  • 这不起作用,因为单例对所有正在运行的线程全局可用。假设在 ASP.NET 环境中使用此单例,所有请求都将具有相同的单例实例。
  • 您也可以使用标准类,您的 IOC 容器可以为您提供它的单例实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-15
  • 1970-01-01
  • 2014-04-30
  • 2019-07-28
相关资源
最近更新 更多