[asp.net-mvc]处理后使用的 ObjectContext (每个请求)

发布时间: 2017/3/25 13:11:14
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我使用创建一个 ObjectContext 每请求概念。我在技术上,要加入到 HttpContext.Current.Items 的 ObjectContext 实例。但我不知道如何正确地杀死此实例。是安全使用 http 模块所和处置 ObjectContext 内的吗?我的意思是请求的,http 模块所可能呼吁任何类型。我不想使用 DI/IoC 的事项,因为该项目需要对轻量级 (不允许第三方库)。

更新︰ 在这里简单的代码︰ 创建每个请求 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;
        }
    }
}

解决方法 1:

它会比较安全的在 BeginRequest 期间创建的上下文,然后释放它在 EndRequest 或 ReleaseRequestState (大概是 EndRequest)。 Init 是当模块烧起,处置时模块本身将被释放和模块不创建和处理每个请求。

* 更新注释 *

模块应该使用其 Init 方法将附加到应用程序事件,如下所示︰

public void Init(HttpApplication app)
{
   app.BeginRequest += new EventHandler(OnBeginRequest);
   app.EndRequest += new EventHandler(OnEndRequest);
}

请注意,有其它语法可用,但这就是记录在 MSDN 的那个。

在每次击中您的应用程序的请求,将会触发。 所以如果您的 IIS 设置路由静态文件请求 (如图像和 css 文件) 通过应用程序 (这是真正的 IIS 7 在集成的管线模式下),然后您的事件处理程序需要考虑到,不旋转了一个 ObjectContext 实例的情况下,你不需要一个。

* 为 MVC 更新 *

既然您使用 MVC 应用程序,您还可以考虑这样做,在控制器基类或 actionfilter,使用 OnActionExecuting 和 OnActionExecuted 的调用。

作为 ActionFilter,你可以确保你它仅适用于需要的数据上下文的控制器。

官方微信
官方QQ群
31647020