1

我有使用实体框架作为 ORM 的 ASP.NET MVC 应用程序。现在我将PerWebRequest生活方式用于 EF ObjectContext

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

我想将ObjectContext的生活方式更改为Pooled,但是有一个问题。

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

使用PerWebRequest这不是问题,因为ObjectContext实例实例化一次并保证在EndRequest事件上释放。

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

在我看来,我应该为 Windsor 实现自定义LifestyleManager或自定义IPool。但是我不知道如何将PooledPerWebRequest生活方式结合起来,因为在 Windsor 中缺乏经验。

你能给我一些想法吗?谢谢。

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

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

  • 使用无状态上下文(关闭 ChangeTracking)进行查询。对于命令,请使用另一个实例。
  • 返回池时重置上下文的状态。
4

2 回答 2

3

不要重用ObjectContext跨请求。您将在请求之间(以及可能在用户之间)泄漏共享状态。该类ObjectContext不是为重用而设计的。

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

于 2012-08-11T19:15:03.213 回答
0

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

于 2012-08-11T18:39:49.580 回答