2009-01-05 32 views
8

我一直在研究一個WCF服務庫,希望所有的業務邏輯都能最終生存下來。我遇到的問題是,有時我必須快速修復服務,並且爲了應用這些修補程序,我必須停止Windows服務,更換服務DLL,然後重新啓動Windows服務。隨着我們開始將越來越多的邏輯遷移到該層,並且必須關閉整個服務以進行任何更改,這將開始引起額外的麻煩。構建熱插拔WCF服務庫的最佳方法

我想要做的是創建一個Windows服務的空殼並動態加載和卸載服務。按需加載和卸載.Net DLL的最佳方法是什麼?或者更好的依靠IIS來進行這種服務?

回答

8

如果你使用WCF,你需要熟悉的一個名字是Juval Lowy。他是IDesign的創始人,也是WCF最受認可的專家之一。他的書Programming WCF Services強烈建議。

IDesign website提供了一系列與WCF相關的免費下載。您只需提供您的電子郵件地址並遵守IDesign的標準許可協議。

您特別感興趣的可能是App Domain Host,In-Proc Factory和In-Proc Hosting下載找到here

2

您可以使用反射來動態加載您需要的特定邏輯,但是執行您希望描述的內容時,服務中的性能將會非常強大。

如果您之前沒有使用過反射,下面是我從一個項目中抓取的示例。它顯示瞭如何加載程序集並使用一些參數調用方法。

Assembly a = GetAssembly(); 
Type t = ExportModule.GetExportType(a); 
if (t == null) throw new Exception("No proper type found."); 

object iExportModule = Activator.CreateInstance(t); 
object[] arguments = new object[] { _export.ConnectionString, GetFileName() }; 

t.InvokeMember("ExecuteExport", BindingFlags.Default | BindingFlags.InvokeMethod, 
    null, iExportModule, arguments); 

很顯然,我不知道你的環境,但總的來說我要說的是,它要好得多關閉服務幾分鐘更新的軟件,而不是改變你的整個模式是動態的。

如果你確實有不斷的熱修復需要服務下來,我不認爲你應該有一箇中央服務。你會一直放下來。最好有獨立的服務來處理不同的邏輯功能,這樣整個應用程序就不會失效(單點故障)。

1

將程序集加載到AppDomain後,它將一直保留在內存中,直到該AppDomain被卸載並銷燬。因此,爲了模擬「熱插拔」環境,您必須設置並拆除將承載實際業務程序集並運行應用程序邏輯的AppDomain(來自主進程'AppDomain')。不用說,如果您每次WCF服務調用不斷創建/銷燬AppDomain,則應該會出現性能下降。它旨在創建一個與您的主AppDomain隔離的操作界限,以執行持續很長時間的有意義的工作。 AppDomain的優勢在於,您可以使用conserve memory usage,前提是您有相當多的業務邏輯程序集要隨時卸載。

這種類型的動態設置和拆卸的主要例子是ASP.NET。 ASP.NET運行時爲每個Web應用程序創建一個AppDomain。如果Web站點中的某些內容發生更改(如web.config),則會卸載AppDomain併爲新版本的Web應用程序(應用程序回收)提供新的AppDomain設置。

0

嘗試使用MEF管理依賴和MAF(System.AddIn)以加載/卸載加載項。