首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StructureMap InstanceScope.Hybrid和IDisposable

StructureMap InstanceScope.Hybrid和IDisposable
EN

Stack Overflow用户
提问于 2009-02-02 13:02:43
回答 3查看 4.1K关注 0票数 7

我正在开发一个asp.net-mvc应用程序。linq数据上下文通过结构映射传递到我的服务对象中。我得到的是有一个混合的范围。这一切都运行得很好。

代码语言:javascript
复制
protected override void configure()
{
    ForRequestedType<AetherDataContext>()
        .TheDefaultIs(() => new AetherDataContext())
        .CacheBy(InstanceScope.Hybrid);
}

问题是我一直在运行我们的内存,我想知道IDisposable接口是否真的被调用过。

有人有什么想法吗?

如果做不到这一点,有没有人对可能导致我的内存异常的事情有任何其他想法?

更新:

所以一些额外的信息,我只是在我的数据上下文中添加了几个方法,并在其中放置了刹车点。

代码语言:javascript
复制
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();
}

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

不管怎样,两个刹车点都没被击中。但是,每次请求时都会调用同一个类的构造函数。我觉得不是很理想。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-02-02 14:54:14

这几乎和我两天前问的问题一模一样:Session containing items implementing IDisposable

InstanceScope.Hybrid只将对象存储在HttpContext.Current.Items中(如果存在),否则存储在ThreadLocal存储中,InstanceScope.HttpSession的工作方式与使用HttpSession和ThreadLocal的方式相同。items集合存在于每个请求中,因此如果您实现了我的问题中指出的模式,您应该会看到Dispose在当前请求的末尾触发。

票数 1
EN

Stack Overflow用户

发布于 2009-02-02 15:26:49

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

代码语言:javascript
复制
HttpContextBuildPolicy.DisposeAndClearAll();

在HttpContext和ThreadLocal上方便的

清理方法。ThreadLocalStoragePolicy.DisposeAndClearAll(). ()、HttpContextBuildPolicy.DisposeAndClearAll()调用任何一个方法都将弹出所有缓存的实例,如果对象为IDisposable,则调用IDispose。

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

我们将拭目以待。

票数 4
EN

Stack Overflow用户

发布于 2009-02-03 14:55:14

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/503120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档