2012-11-25 95 views
3

有誰知道如何從對象緩存中刪除單個實例嗎? 我有一個類,我使用StructureMap獲取實例。有時候,一個實例可能會失效,所以我想從緩存中刪除它,以確保下次我撥打ObjectFactory.GetInstance時,我得到一個新創建的實例。這應該適用於不同種類的生命週期。StructureMap刪除單個實例

我不想刪除該類型的所有實例,也不想刪除其他類型的任何其他實例。

+0

爲什麼此實例無效?在幹什麼? – Steven

+0

這是一個LINQ to sql datacontext包裝。如果發生異常,則不應重新使用datacontext,而應創建新的。 但是,當我寫這個評論時,我意識到,我的datacontext包裝器可以處理datacontext並創建一個新的... – rekna

回答

1

當你需要用一個新的註冊服務實例替換一個註冊服務的實例時,這通常表明該實例的活動時間太長。 A DataContext就是一個很好的例子。因爲它不是線程安全的,所以DataContext不應超過它創建的(web)請求。即使不處理Web應用程序,通常也會有某種請求在其中運行,並且每個請求都有自己的DataContext實例。

如果發生異常,通常應儘可能快地中止完整操作。在大多數情況下,試圖恢復和繼續通常被認爲是一件壞事。這是一個通用的軟件原理,與DI無關。在大多數情況下,你不知道到底發生了什麼問題,甚至可能使事情變得更糟。持續不會使您的應用程序更健壯。這隻會讓它更難找到錯誤。

長話短說:您應該在單個請求的生命週期內最多緩存DataContext,並且在發生異常時不要嘗試替換它。只要讓請求失敗(並記錄你需要的所有信息來找到bug並修復它)。

如果您正在運行ASP.NET應用程序,則可以將DataContext實例配置爲HttpContextScoped

+0

這正是我所做的......實例的作用域爲http請求的持續時間或持續時間的任務。但有時候發生異常時,需要執行一些額外的操作,包括將信息寫入數據庫。所以我需要一個新的數據上下文。 – rekna