2009-02-02 71 views
7

我正在研究一個asp.net-mvc應用程序。 linq數據上下文正在通過結構圖傳遞到我的服務對象中。我已經有了一個混合的範圍。這一切都很好。StructureMap InstanceScope.Hybrid和IDisposable

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(); 
} 

我不太確定我是否以正確的方式進行此操作,我猜測新方法將被調用?

無論如何,制動點都沒有被擊中。然而,同一個類的構造函數在每個請求上都被調用。不理想我在想。

+0

我一直想知道IDisposables和各種緩存策略會發生什麼。如果在文檔中找不到任何內容,請在Dispose()中粘貼斷點並查看它何時發生(如果有的話)。我會對這個 – 2009-02-02 13:46:46

+0

的迴應感興趣,你最終會採用哪種解決方案?我有一個目前類似的關注:http:// stackoverflow。com/questions/3665336/iqueryable-repository-with-structuremap -ioc-how-do-i-implement -isisposable – RPM1984 2010-09-08 09:20:07

回答

1

這是我問3天前的問題幾乎是完全相同的副本:Session containing items implementing IDisposable

InstanceScope.Hybrid只是儲存在內部HttpContext.Current.Items對象(如果存在)或以其他方式ThreadLocal的存儲和InstanceScope.HttpSession的工作除了它使用HttpSession和ThreadLocal以外的其他方式。 items集合每個請求都有生命,所以如果你實現了在我的問題中指出的模式,你應該在當前請求的最後看到Dispose射擊。

+0

我特別感興趣的是什麼結構地圖是用類來完成的,而不是周圍的應用程序在結束時做了什麼它的一生。如果我錯了,請隨時糾正我。 – 2009-02-02 14:58:05

4

好了,所以StructureMap (2.3.5)最新版本有要求的HttpContext和ThreadLocal的

HttpContextBuildPolicy.DisposeAndClearAll(); 
清理方便的方法,一個有用的小方法。 HttpContextBuildPolicy.DisposeAndClearAll(),ThreadLocalStoragePolicy.DisposeAndClearAll()。調用任一方法將彈出所有緩存實例,如果對象爲IDisposable,則調用IDispose。

以前,dispose方法沒有被調用,我把它添加到Application_EndRequest中,它們現在是。我希望這將解決我的一些記憶問題。

我們將會看到。

0

所以解決方案;它的卡西尼造成了問題。基本上它爲每個請求創建一個新的上下文。這就是爲什麼我看到上下文被重新創建,至於爲什麼它不叫我一次性妥善我不知道。但我仍然準備相信這與卡西尼有關。