2009-01-05 8 views
8

Ich habe an einer WCF-Servicebibliothek gearbeitet, in der hoffentlich die gesamte Geschäftslogik enden wird. Das Problem, auf das ich stoße, ist, dass ich manchmal schnelle Korrekturen an einem Dienst vornehmen muss und um diese Fixes anzuwenden, muss ich den Windows-Dienst stoppen, die Dienst-DLL ersetzen und dann den Windows-Dienst neu starten. Dies wird zusätzliche Probleme bereiten, wenn wir mehr und mehr von unserer Logik auf diese Ebene migrieren und den gesamten Dienst herunterfahren müssen, um Änderungen vorzunehmen.Die beste Methode zum Erstellen einer Hot-Pluggable-WCF-Servicebibliothek

Ich möchte eine leere Shell eines Windows-Dienstes erstellen und die Dienste dynamisch laden und entladen. Was ist der beste Weg zum Laden und Entladen von .Net DLLs bei Bedarf? Oder ist es besser, sich für diese Art von Service auf IIS zu verlassen?

Antwort

8

Wenn Sie WCF verwenden, ist ein Name, mit dem Sie vertraut sein müssen, Juval Lowy. Er ist der Gründer von IDesign und einer der anerkanntesten Experten in Bezug auf WCF. Sein Buch Programming WCF Services wird dringend empfohlen. Das IDesign bietet eine ganze Reihe von kostenlosen Downloads für WCF. Sie müssen lediglich Ihre E-Mail-Adresse angeben und sich an die Standardlizenzvereinbarung von IDesign halten.

Von besonderem Interesse für Sie möglicherweise die App-Domain-Host, die In-Proc-Fabrik und die In-Proc-Hosting-Downloads gefunden here.

2

Sie können wahrscheinlich Reflektion verwenden, um spezifische Logik dynamisch zu laden, die Sie benötigen, aber die Leistung, die auf Ihren Diensten getroffen wird, wird gewaltig sein, was Sie wollen, das Sie beschrieben haben.

Wenn Sie noch keine Reflexion verwendet haben, hier ist ein Beispiel, das ich von einem Projekt, das ich habe, genommen habe. Es zeigt, wie eine Assembly geladen und eine Methode mit einigen Parametern aufgerufen wird.

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

Offensichtlich Ich weiß nicht, Ihre Umgebung, aber im Allgemeinen würde ich sagen, dass seine viel besser den Dienst herunterzufahren für ein paar Minuten, um die Software zu aktualisieren, als das gesamte Paradigma zu ändern dynamisch.

Wenn Sie wirklich konstante Hotfixes haben, die den Dienst herunterfahren müssen, denke ich nicht, dass Sie einen zentralen Dienst haben sollten. Du würdest es die ganze Zeit runter nehmen. Bessere separate Dienste, die sich mit verschiedenen logischen Funktionen befassen, sodass Ihre gesamte Anwendung nicht zum Absturz gebracht wird (Single Point of Failure).

1

Sobald eine Baugruppe in eine AppDomain geladen wurde, bleibt sie im Speicher, bis die AppDomain entladen und zerstört wird. Um eine "hot pluggable" -Umgebung zu simulieren, müssen Sie also AppDomains (aus dem Hauptprozess "AppDomain") einrichten und herunterfahren, die die eigentlichen Geschäftsassemblys hosten und die Anwendungslogik ausführen.

Es ist unnötig zu sagen, dass Sie eine Leistungseinbuße erwarten sollten, wenn Sie AppDomains pro WCF-Serviceaufruf ständig erstellen/löschen. Es ist beabsichtigt, eine Betriebsgrenze zu erstellen, die von Ihrer Hauptanwendungsdomäne isoliert ist, um sinnvolle Arbeit zu leisten, die für eine gute Dauer dauert. Der Vorteil mit AppDomains ist, dass Sie conserve memory usage haben, wenn Sie ziemlich viele Business-Logik-Baugruppen haben, die Sie im Laufe der Zeit entladen möchten.

Das beste Beispiel für diese Art von dynamischem Setup und Abbau ist ASP.NET. Die ASP.NET-Laufzeit erstellt für jede Webanwendung eine Anwendungsdomäne. Wenn sich auf der Website etwas ändert, z. B. web.config, wird die AppDomain entladen und eine neue AppDomain-Einrichtung für die neue Version der Webanwendung - Anwendung recycle - eingerichtet.

0

Verwenden Sie MEF zum Verwalten von Abhängigkeiten zusammen mit MAF (System.AddIn) zum Laden/Entladen von Addins.

Verwandte Themen