将汇集的生活方式与温莎的PerWebRequest Lifestyle整合在一起

时间:2012-08-11 13:33:49

标签: .net castle-windsor pool perwebrequest

我有使用Entity Framework作为ORM的ASP.NET MVC应用程序。 现在我对EF ObjectContext 使用 PerWebRequest 生活方式。

在高负载下分析应用程序性能时,我发现ObjectContext创建存在瓶颈。

我想将 ObjectContext 的生活方式改为合并,但是存在问题。

在我的应用程序的遗留部分中,有服务定位器反模式。因此,每个Web请求可以多次解析ObjectContext,并且在使用后不会显式释放。

使用 PerWebRequest ,这不是问题,因为 ObjectContext 实例已实例化一次并在 EndRequest 事件中保证发布。

使用默认的合并生活方式,每个 Resolve 方法调用都会返回不同的 ObjectContext 实例。但我想在Web请求范围中重新使用单个实例。 此外,我希望实例在请求结束时自动释放(返回池)(使用 PerWebRequestLifestyleModule )。

在我看来,我应该为Windsor实施自定义 LifestyleManager 或自定义 IPool 。 但由于缺乏温莎的经验,我不知道如何结合汇集 PerWebRequest 生活方式。

你能给我任何想法吗? 感谢。

UPD:关于ObjectContext的状态和重用原因

有表现理由。创建ObjectContext非常昂贵。我正在寻找避免它的方法。 我有两种方法来处理ObjectContext的有状态性并重用它:

  • 使用无状态上下文(关闭ChangeTracking)进行查询。对于命令,请使用其他实例。
  • 在返回游泳池时重置上下文的状态。

2 个答案:

答案 0 :(得分:3)

请勿跨请求重复使用ObjectContext。您将泄漏请求之间(以及可能在用户之间)的共享状态。 ObjectContext类不能重复使用。

在你的问题中,我没有找到不使用PerWebRequest的理由,所以只需使用它。

答案 1 :(得分:0)

在您的情况下,您可以将生活方式更改为绑定到当前线程,确保Web应用程序中的每个工作线程都获得实例