c# - 使用后处理 ObjectContext(每个请求)

标签 c# asp.net-mvc entity-framework inversion-of-control

我正在使用为每个请求创建一个 ObjectContext 的概念。从技术上讲,我将 ObjectContext 实例添加到 HttpContext.Current.Items。但我不知道如何正确地杀死这个实例。使用 HttpModule 并在其中配置 ObjectContext 是否安全?我的意思是,可能会为任何类型的请求调用 HttpModule。我不想使用 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;
        }
    }
}

最佳答案

在 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 实例来解决这一问题你不需要一个。

* MVC 更新 *

由于您使用的是 MVC 应用程序,您还可以考虑在 Controller 基类或操作过滤器中使用 OnActionExecuting 和 OnActionExecuted 调用执行此操作。

作为 ActionFilter,您可以确保仅将其应用于需要数据上下文的 Controller 。

关于c# - 使用后处理 ObjectContext(每个请求),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6292993/

相关文章:

asp.net-mvc - Azure ASP.NET MVC Web.Config 部署问题

c# - 如何仅使用单向导航对 Entity Framework 实体/映射进行建模

c# - LINQ:如何使用 IQueryable() 选择特定列

c# - 转换 bool 值?在 View 中 bool

javascript - 在 MVC 中创建自定义 Html 帮助程序扩展时如何避免重复的脚本标记

c# - 无法弄清楚如何返回部分 View 而不是全部

.net - 具有非常相似查询的 EF 性能非常不同

c# - 将属性设置为虚拟时停止加载 Entity Framework

c# - 匹配进程参数的正则表达式

c# - 如何使用弱类型参数调用泛型方法