2012-08-07 9 views
6

Wie implementiert ein WCF-Kanal (erstellt über ChannelFactory) ICommunicationObject, stellt jedoch die Close() -Methode beispielsweise nicht bereit, es sei denn, Sie übertragen den Proxy an ICommunicationObject? Ist das sinnvoll?Wie implementiert ein WCF-Proxy ICommunicationObject, wenn Methoden nicht sichtbar sind?

Ich habe heute auf dem Weg nach Hause darüber nachgedacht und konnte es in meinem Kopf nicht herausfinden. Vielleicht stelle ich die falsche Frage? Vielleicht stelle ich eine dumme Frage? :)

Ist es eine Art Ninja-Trick?

Antwort

5

Dies geschieht über Explicit Interface Implementation.

Angenommen, Sie eine Schnittstelle haben, etwa so:

public interface IFoo 
{ 
    void Foo(); 
} 

Sie dies in der Regel umsetzen können:

public class Bar : IFoo 
{ 
    public void Foo() {} // Implicit interface implementation 
} 

Alternativ Sie explizit die Schnittstellenelemente implementieren können, die die Besetzung erfordert:

public class Baz : IFoo 
{ 
    void IFoo.Foo() {} // This will require casting the object to IFoo to call 
} 

Th Das kann manchmal sehr nützlich sein. Zum Beispiel wird es oft durchgeführt, um IDisposable in Klassen zu implementieren, wo die bevorzugte API zum Beispiel .Close() aufrufen würde. Indem Sie IDisposable explizit implementieren, "verdecken" Sie die Dispose()-Methode, erlauben aber weiterhin, dass die Klasseninstanz über eine using-Anweisung verwendet wird.

+0

Danke, Reed und Dan! Erster Beitrag gewinnt. –

2

Die Klasse Channel implementiert die Schnittstelle ICommunicationObject explizit. Hier ist ein Beispiel den Unterschied zwischen expliziter Schnittstellenimplementierung demonstriert und impliziter Schnittstellen-Implementierung:

internal interface IExample 
{ 
    void DoSomething(); 
} 

class ImplicitExample : IExample 
{ 
    public void DoSomething() 
    { 
     // ... 
    } 
} 

class ExplicitExample : IExample 
{ 
    void IExample.DoSomething() 
    { 
     // ... 
    } 
} 

class Consumer 
{ 
    void Demo() 
    { 
     var explicitExample = new ExplicitExample(); 
     // explicitExample.DoSomething(); <-- won't compile 
     ((IExample)explicitExample).DoSomething(); // <-- compiles 

     var implicitExample = new ImplicitExample(); 
     implicitExample.DoSomething(); // <-- compiles 
    } 
} 

Hier ist ein Link zu dem einem MSDN-Artikel zu diesem Thema: http://msdn.microsoft.com/en-us/library/ms173157.aspx