2017-05-14 68 views
1

SIMPL eInjector文檔是瞬態和單身註冊很清楚,他們將如何處置等文件表明,與所有,但預構建的對象註冊的單身人士將獲得當容器配置被處置。簡單的注射器ASP.NET辛格爾頓處置

我的問題特別涉及單登記,我需要設置當ASP.NET應用程序被設置(I發送任何剩餘的消息時該服務被設置)。我的大多數註冊都是暫時的,並且在處理每個請求時處理。當在VS/IISExpress中進行調試時,我永遠不會看到我的單身人士什麼時候被處置 - 或者當容器本身最終被處置時。在我的控制檯應用程序&天青服務我完成後,我簡單地調用container.Dispose()。 ASP.NET最終清理的任何線索?

回答

2

對於單身人士處置,你需要顯式調用Container.Dispose()應用程序結束時。這可以在Global.asax中的Application_End事件中完成。但請注意。

我發送任何剩餘的消息時,該服務被設置

這似乎是一個非常糟糕的主意,因爲有很多原因,一個Application_End事件不運行。 IIS可以非常積極地殺死應用程序,因此會停電和其他硬件故障。如果發生這種情況,這意味着您將丟失仍在本地緩衝區中的任何消息。

這可能不適合被用於應用程序心跳,有時記錄揮發性消息的問題,但如果這些消息說明重要商務活動,你應該使用耐用排隊或存儲機制。

當VS/IISExpress調試,我從來沒有看到當我單身得到處置

這可以很好地。在調試Web應用程序時,Web應用程序永遠不會自行停止。如果您停止調試,應用程序突然停止而沒有機會運行任何終結器和清理方法,或者當您停止調試時,應用程序將繼續在後臺運行;這仍然意味着你不會看到任何清理事件發生。

+0

我完全與你同意有關使用這種方法的問題,但總比什麼都不做在多數情況下(即剛剛扔掉任何未發送的郵件)更好。請記住,即使您使用冗餘方法,也不會失敗保險。我所要求的只是在託管的IIS ASP.NET環境中,確保SimpleInjector容器被丟棄的正確方法是什麼,所以我至少有機會嘗試發送任何本地排隊的消息。 OWIN OnApp是否將相當於Application_End? – pseabury

+1

如果失去信息是一個問題,我真的建議你改變你的設計。在請求運行的其餘部分中,將這些消息保存在相同的數據庫事務中。這是防止信息丟失的一種非常常見的方法。關於OWIN:我不確定OnAppDisposing是做什麼的。您必須閱讀文檔並進行測試。 – Steven

+0

我會再看看w.r.t是如何完成特定的消息傳遞的。數據交易。 IIRC,將消息寫入Azure ServiceBus(我們使用的)必須在環境數據庫事務處理範圍之外完成,這種情況在這裏會失敗。請參閱https://docs.particular.net/nservicebus/azure-service-bus/understanding-transactions-and-delivery-guarantees?version=asb_6。感謝Steven的討論! – pseabury