我正在开发一个asp.net-mvc应用程序。linq数据上下文通过结构映射传递到我的服务对象中。我得到的是有一个混合的范围。这一切都运行得很好。
protected override void configure()
{
ForRequestedType<AetherDataContext>()
.TheDefaultIs(() => new AetherDataContext())
.CacheBy(InstanceScope.Hybrid);
}问题是我一直在运行我们的内存,我想知道IDisposable接口是否真的被调用过。
有人有什么想法吗?
如果做不到这一点,有没有人对可能导致我的内存异常的事情有任何其他想法?
更新:
所以一些额外的信息,我只是在我的数据上下文中添加了几个方法,并在其中放置了刹车点。
protected override void Dispose(bool disposing)
{
Debug.WriteLine("Disposing: " + DateTime.Now);
base.Dispose(disposing);
}
public new void Dispose()
{
Debug.WriteLine("Disposing: " + DateTime.Now);
base.Dispose();
}我不太确定我这样做的方式是否正确,我猜新方法会被调用吗?
不管怎样,两个刹车点都没被击中。但是,每次请求时都会调用同一个类的构造函数。我觉得不是很理想。
发布于 2009-02-02 14:54:14
这几乎和我两天前问的问题一模一样:Session containing items implementing IDisposable
InstanceScope.Hybrid只将对象存储在HttpContext.Current.Items中(如果存在),否则存储在ThreadLocal存储中,InstanceScope.HttpSession的工作方式与使用HttpSession和ThreadLocal的方式相同。items集合存在于每个请求中,因此如果您实现了我的问题中指出的模式,您应该会看到Dispose在当前请求的末尾触发。
发布于 2009-02-02 15:26:49
好了,最新版本的StructureMap (2.3.5)有一个有用的小方法,叫做
HttpContextBuildPolicy.DisposeAndClearAll();在HttpContext和ThreadLocal上方便的
清理方法。ThreadLocalStoragePolicy.DisposeAndClearAll(). ()、HttpContextBuildPolicy.DisposeAndClearAll()调用任何一个方法都将弹出所有缓存的实例,如果对象为IDisposable,则调用IDispose。
以前没有调用dispose方法,我将其添加到Application_EndRequest中,现在它们被调用了。我希望这能解决我的一些记忆问题。
我们将拭目以待。
发布于 2009-02-03 14:55:14
所以解决方案就是卡西尼号造成的问题。基本上,它为每个请求创建一个新的上下文。这就是为什么我看到上下文被一次又一次地创建,至于为什么它没有正确地调用I disposable我不知道。但我又一次准备相信这与卡西尼有关。
https://stackoverflow.com/questions/503120
复制相似问题