使用后正在处理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;
        }
    }
}

使用后正在处理ObjectContext(每个请求)

在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,您可以确保仅将其应用于需要数据上下文的控制器。