如何创建类似于Context
对象的全局可访问HttpContext
对象?
我想创建一个自定义类库,我想从网站项目中引用它。在网站项目中,我希望能够在全球范围内调用以下内容:
ClassLibraryName.Context
我无法直接在我的类库中创建全局property
,那么应该如何实现呢?(我见过其他应用程序/产品使用这种方法,其中一种是Sitecore它有一个自定义的Sitecore.Context对象)
这可能是一个“有效”的解决方案吗?
namespace MyLibrary
{
public class Context
{
public static object ContextualObject
{
get;
set;
}
}
}
答案 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上创建对象的实例。