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