2011-10-12 111 views
0

我已經依賴於特定組件一些鬆耦合代碼被加載到當前應用程序域:如何強制將特定程序集加載到MVC 2應用程序的每個應用程序域中?

Assembly assembly = AppDomain.CurrentDomain.GetAssemblies().Where(
    candidateAssembly => candidateAssembly.FullName.StartsWith("Microsoft.WindowsAzure.ServiceRuntime")).SingleOrDefault(); 

和代碼的MVC 2應用程序和產量內部執行null參考,因爲組件沒有加載到當前的應用程序域。我只能從該程序集中調用一些代碼,但這會在該程序集中引入應用程序代碼的強烈依賴性,並且我不再有鬆耦合。

我需要強制IIS(或任何其他)在我的代碼運行之前將該程序集加載到應用程序域中。我試圖編寫一個IHttpModule的實現並將其列在web.config中,但它沒有幫助。

到目前爲止,我試圖在<system.web><compilation><assemblies>下添加程序集,看起來像是有效,但我不確定它是否可靠。

如何強制將特定程序集加載到應用程序域中而不在代碼中引入相關性?

+0

如果您知道它的名稱,Assembly.load應該加載程序集。 MEF也有查找和加載程序集的方法AFAIK –

+0

@Simon Halsey:再一次,這是一個很難的依賴,我想要一些不需要更改代碼的東西。 – sharptooth

+0

在這種情況下,我也會依賴依賴注入工具。例如,StructureMap支持在特定目錄中掃描程序集,這對於這些「拖放」插件要求來說非常合適。 –

回答

0

這是錯誤的方式,它可能會導致嚴重的定時錯誤。

該設置會影響ASP.NET編譯,所以它只會在編譯ASP.NET視圖並且最多編譯一次時強制加載程序集 - 無論是對視圖的第一個請求還是在就地預編譯過程中if後者是設置。無論如何,會有一段時間沒有ASP.NET視圖需要編譯。

現在有29個小時的IIS apppool自動回收。池回收時啓動一個新的工作進程,該進程開始託管站點有效負載。重要的是,ASP.NET視圖在此過程中不會更改,因此無需重新編譯它們,因此不會調用編譯過程,因此不會強制加載<system.web><compilation><assemblies>中列出的程序集。

所以這件事看起來工作,直到29小時過去,然後它只是分崩離析。

需要更好的解決方案。類似於<appSettings>中的設置,表示是否可以使用Azure運行時。如果設置已設置,則代碼可以在Azure運行時程序集內進行第一次調用,這將使它們加載。如果未設置該設置,則不會嘗試調用該代碼。

相關問題