我有一个使用 Entity Framework 作为 ORM 的 ASP.NET MVC 应用程序。 现在我正在使用 EF ObjectContext 的 PerWebRequest 生活方式。
在分析高负载下的应用程序性能时,我发现了 ObjectContext 创建中的瓶颈。
我想将 ObjectContext 的生活方式更改为池化,但有一个问题。
在我的应用程序的遗留部分中,存在服务定位器反模式。因此,每个 Web 请求可以多次解析 ObjectContext,并且在使用后不会显式释放。
对于PerWebRequest,这不是问题,因为ObjectContext实例实例化一次并保证在EndRequest事件上释放。
使用默认的池化生活方式,每个Resolve方法调用都会返回不同的ObjectContext实例。但我想在 Web 请求范围内重新使用单个实例。 另外,我希望实例在请求结束时自动释放(返回池)(使用 PerWebRequestLifestyleModule)。
在我看来,我应该为 Windsor 实现自定义 LifestyleManager 或自定义 IPool。 但由于缺乏温莎经验,我不知道如何结合 Pooled 和 PerWebRequest 生活方式。
你能给我一些想法吗? 谢谢。
UPD:关于 ObjectContext 的状态和重用原因
存在性能原因。 ObjectContext 的创建是相当昂贵的。我正在寻找避免这种情况的方法。 我有两种方法来处理 ObjectContext 的有状态性质并重用它:
- 使用无状态上下文(ChangeTracking 关闭)进行查询。对于命令,请使用另一个实例。
- 返回池时重置上下文状态。
最佳答案
不要在请求之间重复使用ObjectContext
。您将泄漏请求之间(以及可能在用户之间)的共享状态。 ObjectContext
类并非设计用于重用。
在你的问题中,我没有找到不使用 PerWebRequest
的理由,所以就使用它。
关于.net - 将 Pooled Lifestyle 与 Windsor 中的 PerWebRequest Lifestyle 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11915145/