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