gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:07:44 26 4
gpt4 key购买 nike

我正在使用为每个请求创建一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com