使用后正在处理ObjectContext(每个请求)
本文关键字:请求 ObjectContext 处理 | 更新日期: 2023-09-27 17:58:57
我使用的是为每个请求创建一个ObjectContext概念。从技术上讲,我正在向HttpContext.Current.Items添加ObjectContext实例。但我不知道如何正确地杀死这个实例。在中使用HttpModule和处理ObjectContext是否安全?我的意思是,任何类型的请求都可能调用HttpModule。我不想使用DI/IoC,因为项目需要轻量级(不允许使用第三方libs)。
UPDATE:这里是简单的代码:创建了一个按请求的ObjectContext(实体类)
public static class ObjectContextPerRequest
{
public const string ObjectKey = "_per_request_context_key";
public static Entities PerRequest
{
get
{
if (HttpContext.Current.Items[ObjectKey] != null)
{
var eContext = new Entities();
HttpContext.Current.Items.Add(ObjectKey, eContext);
return eContext;
}
return HttpContext.Current.Items[ObjectKey] as Entities;
}
}
}
和一个处理器模块:
class ObjectContextManagerModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.EndRequest += (s, e) => { Dispose(); };
}
public void Dispose()
{
if (HttpContext.Current.Items[ObjectContextPerRequest.ObjectKey] != null)
{
var edmx = (ObjectContext)HttpContext.Current.Items[ObjectContextPerRequest.ObjectKey];
edmx.Dispose();
edmx = null;
}
}
}
在BeginRequest期间创建上下文,然后在EndRequest或ReleaseRequestState(可能是EndRequest)期间处理它会更安全。Init是指模块启动时,Dispose是指模块本身被释放时,并且不会在每个请求中创建和释放模块。
*更新评论*
模块应该使用其Init方法来附加到应用程序事件,例如:
public void Init(HttpApplication app)
{
app.BeginRequest += new EventHandler(OnBeginRequest);
app.EndRequest += new EventHandler(OnEndRequest);
}
请注意,还有其他可用的语法,但这是MSDN上记录的语法。
这将在每个命中您的应用程序的请求时触发。因此,如果您的IIS设置通过应用程序路由静态文件请求(例如图像和css文件)(集成管道模式下的IIS 7也是如此),那么您的事件处理程序需要考虑到这一点,在不需要ObjectContext实例的情况下,不必旋转ObjectContext实例。
*MVC更新*
由于您使用的是MVC应用程序,您还可以考虑在控制器基类或操作过滤器中使用OnActionExecuting和OnActionExecuted调用来执行此操作。
作为ActionFilter,您可以确保仅将其应用于需要数据上下文的控制器。