2010-02-22 6 views
9

Wie der Titel andeutet, versuche ich zu verstehen, warum in WCF manchmal Leute "Proxies generieren" wählen, anstatt mit einer ChannelFactory manuell neue Channel-Instanzen zu erstellen. Ich habe Beispiele von jedem gesehen, aber habe nicht wirklich irgendwelche Erklärungen gefunden, WARUM du für eins gegen das andere gehen würdest.Direct-Channel-Nutzung im Vergleich zu einem Proxy?

Um ehrlich zu sein, ich habe immer nur mit den Kanälen und die ChannelFactory<T> von Code, den ich geerbt haben, dh gearbeitet:

IChannelFactory<IDuplexSessionChannel> channelFactory = 
    binding.BuildChannelFactory<IDuplexSessionChannel>(); 

_duplexSessionChannel = channelFactory.CreateChannel(endpointAddress); 

Also warum soll ich „erzeugt einen Proxy“? Was sind die Vor- und Nachteile?

Antwort

17

Der wesentliche Unterschied ist dieser:

  • einen Proxy-Generierung Sie erfordert die URL zu wissen, wo sich der Dienst befindet. Durch die Erzeugung des Proxy, alles andere (der Servicevertrag und die Datenverträge beteiligt ist) wird durch Überprüfen der Metadaten des Dienstes

  • bestimmt werden, um direkt eine ChannelFactory<T> zu erstellen, müssen Sie direkten Zugriff auf die Baugruppe, die enthält Dieser Servicevertrag T für den Sie eine Kanalfactory generieren. Dies funktioniert nur, wenn Sie beide Enden des Kanals im Grunde steuern, und Sie können die Baugruppe freigeben, die diese Serviceverträge enthält. Normalerweise wird dies bei einem Drittanbieter nicht der Fall sein - mit Ihren eigenen Diensten, ja.

Der zweite wichtige Punkt ist:

  • die Schaffung eines generierten Proxy im Grunde die beiden Schritte tut, die Sie tun würde - erstellen ChannelFactory<T>, und davon, dass die tatsächliche Kanal erstellen - in einem einfacher Konstruktor. Sie haben keine Kontrolle über diese beiden Schritte.

  • Ihre eigenen Channel-Erstellung ist vorteilhaft, da die Erstellung der ChannelFactory<T> ist der teure Schritt - so können Sie Ihre Kanal Factory-Instanz irgendwo zwischenspeichern. Erstellen und neu zu erstellen, den tatsächlichen Kanal von der Fabrik ist viel weniger beteiligt Schritt, die Sie häufiger

So tun können, wenn Sie an beiden Enden der Kommunikation steuern tun, Service und Client, Sie zu tun haben die Möglichkeit, Teilen Sie die Serviceverträge in einer separaten Assembly und Sie haben somit mehr Möglichkeiten.

Mit den meisten Diensten von Drittanbietern haben Sie einfach diese Option nicht.

3

Die Verwendung eines Proxy ist einfacher und einfacher zu verstehen. Sie können sich mit einfachen Dingen beschäftigen - Klassen und Methoden für diese Klassen - anstelle von komplexen netzwerkbezogenen Dingen wie Kanälen.

OTOH, wird dies nicht einfacher gemacht durch die Konstruktionsfehler in WCF, die die gleiche einfache Verwendung eines WCF-Proxy verhindert, dass wir mit ASMX Proxies tun konnte:

using (var client = new MyServiceClient()) 
{ 
} 

Wenn Sie mit WCF verwenden dieses Muster, Sie können die ursprüngliche Ausnahme verlieren, wenn der Block aufgrund einer Ausnahme beendet wird. client.Dispose() kann eine Ausnahme auslösen, die die ursprünglich geworfene Ausnahme überschreibt. Ein komplexeres Muster ist erforderlich.

+0

Irgendein Grund für den Downvote? –

2

Dies kann Ihnen helfen:

Wenn ein Proxy zu benutzen?

Wenn Sie einen Dienst haben, von dem Sie wissen, dass er von mehreren Anwendungen verwendet wird oder generisch genug ist, um an mehreren Stellen verwendet zu werden, sollten Sie die Proxy-Klassen verwenden.

Wann wird ChannelFactory verwendet?

ChannelFactory-Klasse wird verwendet, um einen Kanal zwischen dem Client und dem Dienst ohne die Notwendigkeit eines Proxy zu erstellen. In einigen Fällen verfügen Sie möglicherweise über einen Dienst, der fest an die Client-Anwendung gebunden ist. In diesem Fall können Sie direkt auf die Interface-DLL verweisen und ChannelFactory verwenden, um Ihre Methoden aufzurufen.

Sie können auch folgenden Link beziehen sich auf die Differenz zwischen Kanalfactory und Proxy-Klasse zu verstehen http://ashishkhandelwal.arkutil.com/wcf/channelfactory-over-proxy-class-in-wcf/

1

Der Hauptvorteil des Channel ist der Proxy zur Laufzeit dynamisch on the fly erstellen können. Mit SvcUtil (Webreferenz in VS hinzufügen) erstellen Sie den Proxy zur Entwurfszeit, so dass die Implementierung statischer ist.