ASP.NET - 创建自定义上下文对象?

时间:2011-03-01 11:02:39

标签: asp.net

如何创建类似于Context对象的全局可访问HttpContext对象?

我想创建一个自定义类库,我想从网站项目中引用它。在网站项目中,我希望能够在全球范围内调用以下内容:

ClassLibraryName.Context

我无法直接在我的类库中创建全局property,那么应该如何实现呢?(我见过其他应用程序/产品使用这种方法,其中一种是Sitecore它有一个自定义的Sitecore.Context对象)

修改

这可能是一个“有效”的解决方案吗?

namespace MyLibrary
{
  public class Context
  {
    public static object ContextualObject
    {
      get;
      set;
    }
  }
}

3 个答案:

答案 0 :(得分:5)

是的,这并不难实现,如果你总是在ASP.NET应用程序的上下文中运行这个类,请使用这种方法:

namespace MyLibrary
{
  public class Context
  {
    public static object ContextualObject
    {
      get
      {
           var ctx = System.Web.HttpContext.Current.Items[typeof(Context)];
           if (ctx == null)
           {
               ctx = new Context();
               System.Web.HttpContext.Current.Items.Add(typeof(Context), ctx);
           }

           return ctx;
      }
      set { System.Web.HttpContext.Current.Items[typeof(Context)] = ctx; }
    }
  }
}

基本上包装现有的HTTP上下文以提供您自己的服务。这种方法也不会在应用程序存在时存储对象,它只为当前上下文创建它,当响应结束时,它将会死亡,并在下一个生命周期中重新生成。如果不是这样,请存储对上下文的静态引用。

我在http://nucleo.codeplex.com的类库中使用过这种方法,效果很好。

HTH。

答案 1 :(得分:1)

这取决于您希望Context对象拥有的生命周期。如果您希望所有客户使用相同的上下文,您可以使用singleton implementation

如果您希望每个线程或http请求的上下文都是唯一的,则必须使用每个请求/线程实现。实现每个http请求实现的一种方法是让HttpModule在每个BeginRequest事件中创建对象并将其粘贴到HttpContext Items集合中。

public static object ContextualObject 
{ 
  get { return HttpContext.Current.Items["MyContext"];} 
}

答案 2 :(得分:0)

您可以在Global.asax中的Session_Start上创建对象的实例。