【问题标题】:StructureMap InstanceScope.Hybrid and IDisposableStructureMap InstanceScope.Hybrid 和 IDisposable
【发布时间】:2009-02-02 13:02:42
【问题描述】:

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

我不太确定我这样做的方法是否正确,我猜会调用新方法?

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

【问题讨论】:

  • 我一直想知道 IDisposables 和各种缓存策略会发生什么。在文档中找不到任何内容时,请在 Dispose() 中设置断点并查看它何时发生(如果有的话)。我会对对此的回应感兴趣
  • 您最终采用了什么解决方案?我目前有类似的担忧:stackoverflow.com/questions/3665336/…

标签: c# asp.net-mvc linq inversion-of-control structuremap


【解决方案1】:

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

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

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

我们会看到的。

【讨论】:

  • 我会担心在 Application_EndRequest 中有这个,因为 HttpContext 在 global.asax 中不存在,这将触发每个页面请求。我看到并发问题的巨大潜力,更不用说我认为它实际上不会正常工作,因为 HttpContext 不存在。
  • 我遇到的问题是正在为每个请求创建一个 DataContext 的实例。我可以在每次请求时摆脱它。或者停止重新创建它们,有什么想法吗?
  • 如果您使用 InstanceScope.Hybrid,它将为每个请求创建一个新的上下文。这就是 Hybrid 的目的是为每个请求缓存您的对象。如果您希望它持续更长时间,请查看 HttpSession 或 Singleton,但要小心保持数据上下文的时间更长,我不确定其含义
  • 你好,这里提到的方法调用好像在当前的StructureMap(2.6.3)中已经去掉了,换成了这个:ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
【解决方案2】:

这几乎与我两天前提出的问题完全相同:Session containing items implementing IDisposable

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

【讨论】:

  • 我特别感兴趣的是结构映射对类的作用,而不是周围的应用程序在其生命周期结束时的作用。如果我错了,请随时纠正我。
  • 除非它没有,我检查了。我找到了一个解决方案并将其粘贴在下面。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多