7

我正在开发一个 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();
}

我不太确定我是否以正确的方式执行此操作,我猜会调用新方法?

无论如何,没有一个刹车点被击中。但是,每个请求都会调用同一类的构造函数。不理想我想。

4

3 回答 3

4

好的,所以最新版本的 StructureMap (2.3.5)有一个有用的小方法,称为

HttpContextBuildPolicy.DisposeAndClearAll();
清理 HttpContext 和 ThreadLocal 上的便捷方法。HttpContextBuildPolicy.DisposeAndClearAll()、ThreadLocalStoragePolicy.DisposeAndClearAll()。如果对象是 IDisposable,调用任一方法都会弹出所有缓存的实例并调用 IDispose。

以前没有调用 dispose 方法,我将其添加到 Application_EndRequest ,现在它们是。我希望这能解决我的一些记忆问题。

我们会看到的。

于 2009-02-02T15:26:48.947 回答
1

这几乎是我 2 天前提出的问题的精确副本:包含实施 IDisposable 的项目的会话

InstanceScope.Hybrid 仅将对象存储在 HttpContext.Current.Items 中(如果存在)或 ThreadLocal 存储,否则 InstanceScope.HttpSession 的工作方式与使用 HttpSession 和 ThreadLocal 的方式相同。项目集合每个请求都存在,因此如果您实施我的问题中指出的模式,您应该会在当前请求结束时看到 Dispose 触发。

于 2009-02-02T14:54:14.363 回答
0

所以解决方案;它的卡西尼号造成了问题。基本上它为每个请求创建一个新的上下文。这就是为什么我看到再次创建上下文的原因,至于为什么它没有正确地调用我一次性我不知道。但我再次准备相信这与卡西尼号有关。

于 2009-02-03T14:55:13.970 回答