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

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

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

有帮助吗?

解决方案

这是我问3天前的问题几乎是完全相同的副本:含有实施项目会议IDisposable的

如果它存在或ThreadLocal的存储否则和InstanceScope.HttpSession作品比它使用HttpSession中和的ThreadLocal其他相同的方式

InstanceScope.Hybrid只是存储内部HttpContext.Current.Items的对象。项目集合住每个请求,所以如果你实现这个模式指出了我的问题,你应该看到在处置当前请求结束射击。

其他提示

好的,最新版本的 StructureMap (2.3.5) 有一个有用的小方法叫做

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

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

我们将会看到。

因此,解决办法;其卡西尼造成的问题。基本上,它为每个请求新的上下文。这就是为什么我看到上下文中创建了一遍,至于为什么它没有要求我一次性正确我不知道。但同样,我愿意相信,这是是与卡西尼号。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top