Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 将汇集生活方式与温莎的PerWebRequest生活方式相结合_.net_Castle Windsor_Pool_Perwebrequest - Fatal编程技术网

.net 将汇集生活方式与温莎的PerWebRequest生活方式相结合

.net 将汇集生活方式与温莎的PerWebRequest生活方式相结合,.net,castle-windsor,pool,perwebrequest,.net,Castle Windsor,Pool,Perwebrequest,我有一个ASP.NETMVC应用程序,它使用实体框架作为ORM。 现在我正在使用EFObjectContext的PerWebRequest生活方式 在分析高负载下的应用程序性能时,我发现ObjectContext创建中存在瓶颈 我想将ObjectContext的生活方式改为Pool,但有一个问题 在我的应用程序的传统部分中有服务定位器反模式。因此,ObjectContext可以在每个web请求中多次解析,并且在使用后不会显式释放 对于PerWebRequest来说,这不是一个问题,因为Objec

我有一个ASP.NETMVC应用程序,它使用实体框架作为ORM。 现在我正在使用EFObjectContextPerWebRequest生活方式

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

我想将ObjectContext的生活方式改为Pool,但有一个问题

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

对于PerWebRequest来说,这不是一个问题,因为ObjectContext实例实例化一次并在EndRequest事件上发布

默认情况下,对于每个Resolve方法调用,都会返回不同的ObjectContext实例。但我想在web请求范围内重复使用单个实例。 我还希望实例在请求结束时自动释放(返回池)(使用PerWebRequestLifestyleModule

在我看来,我应该为温莎实施定制生活方式管理器或定制IPool。 但我不知道如何将混合PerWebRequest生活方式结合起来,因为我在温莎缺乏经验

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

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

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

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

在您的情况下,您可以更改绑定到当前线程的生活方式,确保web应用程序中的每个工作线程都获得一个实例

不要跨请求重用
ObjectContext
。您将在请求之间(可能在用户之间)泄漏共享状态。
ObjectContext
类不是为重用而设计的


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

不,不应重用ObjectContext类。此外,单个ASP.NET请求可以在多个线程上执行(非并发,但仍在多个线程上)。对!我不是一个实体框架类型的人——从这个问题我推断ObjectContext实际上可以重用,因为他自己建议使用池生命周期作为答案。请参阅我的更新以了解原因。请注意,我建议对每个请求重用上下文。这绝对是正确的做法。为每个请求创建一个上下文几乎是无法衡量的。如果你不这么认为,我很想看看你的尺寸。;无状态上下文可能会起作用,但我对EF的了解还不够。不确定是否可以重置上下文的状态。请注意,这里引入了一个不确定性元素。通常,请求是100%隔离的,而现在不是。这就像线程错误:不确定,不可调试。如果这是我作为领队的决定,我将禁止这样做。