我有使用实体框架作为 ORM 的 ASP.NET MVC 应用程序。现在我将PerWebRequest生活方式用于 EF ObjectContext。
在分析高负载下的应用程序性能时,我发现了 ObjectContext 创建的瓶颈。
我想将ObjectContext的生活方式更改为Pooled,但是有一个问题。
在我的应用程序的遗留部分有服务定位器反模式。因此,每个 Web 请求都可以多次解析 ObjectContext,并且在使用后不会显式释放。
使用PerWebRequest这不是问题,因为ObjectContext实例实例化一次并保证在EndRequest事件上释放。
对于默认的Pooled生活方式,将为每个Resolve方法调用返回不同的ObjectContext实例。但我想在 Web 请求范围内重新使用单个实例。此外,我希望实例在请求结束时自动释放(返回池)(使用PerWebRequestLifestyleModule)。
在我看来,我应该为 Windsor 实现自定义LifestyleManager或自定义IPool。但是我不知道如何将Pooled和PerWebRequest生活方式结合起来,因为在 Windsor 中缺乏经验。
你能给我一些想法吗?谢谢。
UPD:关于 ObjectContext 的状态和重用原因
有性能原因。ObjectContext 的创建非常昂贵。我正在寻找避免它的方法。我有两种方法来处理 ObjectContext 的有状态性质并重用它:
- 使用无状态上下文(关闭 ChangeTracking)进行查询。对于命令,请使用另一个实例。
- 返回池时重置上下文的状态。