.net - 将 Pooled Lifestyle 与 Windsor 中的 PerWebRequest Lifestyle 集成

标签 .net castle-windsor pool perwebrequest

我有一个使用 Entity Framework 作为 ORM 的 ASP.NET MVC 应用程序。 现在我正在使用 EF ObjectContextPerWebRequest 生活方式。

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

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

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

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

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

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

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

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

存在性能原因。 ObjectContext 的创建是相当昂贵的。我正在寻找避免这种情况的方法。 我有两种方法来处理 ObjectContext 的有状态性质并重用它:

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

最佳答案

不要在请求之间重复使用ObjectContext。您将泄漏请求之间(以及可能在用户之间)的共享状态。 ObjectContext 类并非设计用于重用。

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

关于.net - 将 Pooled Lifestyle 与 Windsor 中的 PerWebRequest Lifestyle 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11915145/

相关文章:

c# - 为什么这个 Unity XML 配置没有解析类型?

sitecore - 在多站点环境中使用 IoC 容器

asp.net-mvc - 将 MembershipProvider 注入(inject) ASP.NET MVC AccountController

c++ - 为什么 C++ 标准库容器使用内存池,如果显然 malloc/free 对做同样的工作?

c# - 使用 EF 数据库设置 WCF 服务的正确方法是什么?

c# - 如何为类库包含 log4net?

node.js - Node.js 中的非阻塞循环和池化?

sql - Azure Synapse、SQL 池作为数据流中的源

.net - “System.IO.Stream”在 Windows 应用商店应用中不包含 'Close' 的定义

generics - 开放式通用装饰器类型的 CaSTLe Windsor 注册