在温莎集成Pooled生活方式与PerWebRequest生活方式

问题描述:

我有使用实体框架作为ORM的ASP.NET MVC应用程序。 现在我正在使用PerWebRequest EF的生活方式ObjectContext在温莎集成Pooled生活方式与PerWebRequest生活方式

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

我想更改ObjectContext的生活方式为联合,但有一个问题。

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

随着PerWebRequest这不是一个问题,因为ObjectContext的实例实例化一次,并公布在保证EndRequest事件。

随着汇集生活方式不同的ObjectContext例如默认将返回每个解决方法调用。但我想在Web请求范围中使用单个实例。 另外我希望实例在请求结束时自动释放(返回池)(使用PerWebRequestLifestyleModule)。

在我看来,我应该实现自定义LifestyleManager或定制IPool温莎。 但我不知道如何结合汇集PerWebRequest生活方式,因为缺乏温莎的经验。

你能给我任何想法吗? 谢谢。

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

有表现的原因。 ObjectContext的创建非常昂贵。我正在寻找避免它的方法。 我要处理的ObjectContext的状态特性两种方法中重用:

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

不要重复使用跨请求的ObjectContext。您将在请求之间(可能会在用户之间)泄漏共享状态。 ObjectContext类不用于重复使用。

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

+0

感谢您的回答。查看我的更新以了解原因。 – 2012-08-15 12:46:38

+0

请注意,我建议重复使用上下文**每个请求**。这绝对是正确的做法。每个请求创建一个上下文是不可估量的。如果你认为不然,我会有兴趣看到你的测量结果。无国界的情况可能会奏效,我不太了解EF要说的。不确定是否可以重置上下文的状态。 **请注意,您在此处引入了非确定性元素。**通常,请求是100%孤立的,现在不是。这就像线程错误:非确定性的,不可破坏的。如果这是我作为主角的决定,我不会这么做。 – usr 2012-08-15 13:23:02

在你的情况,你可以改变被捆绑到当前线程的生活方式,确保在Web应用程序的每个工作线程得到一个实例

+0

不,不应该重用ObjectContext类。此外,单个ASP.NET请求可以在多个线程上执行(非并发,但仍在多个线程上)。 – usr 2012-08-11 19:15:53

+0

对!我不是一个实体框架类型的人 - 从我推断ObjectContext实际上可以被重用的问题,因为他自己建议使用混合生命周期 – mookid8000 2012-08-12 07:49:59