2012-08-07 10 views
6

¿Cómo implementa un canal WCF (creado a través de ChannelFactory) ICommunicationObject, pero no expone el método Close(), por ejemplo, a menos que usted transfiera el proxy a ICommunicationObject? ¿Tiene sentido?¿Cómo implementa un proxy WCF ICommunicationObject si sus métodos no son visibles?

Llegué a pensar en eso en el camino a casa hoy y no pude entenderlo en mi cabeza. Tal vez estoy haciendo la pregunta incorrecta? ¿Tal vez estoy haciendo una pregunta estúpida? :)

¿Es algún tipo de truco ninja?

Respuesta

5

Esto se hace a través de Explicit Interface Implementation.

Suponga que tiene una interfaz, así:

public interface IFoo 
{ 
    void Foo(); 
} 

Puede implementar esto normalmente:

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

Alternativamente, se puede poner en práctica los elementos de interfaz explícitamente, lo que requiere el reparto:

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

Th puede ser muy útil a veces. Por ejemplo, a menudo se hace para implementar IDisposable en clases donde la API preferida sería llamar al .Close(), por ejemplo. Al implementar IDisposable explícitamente, "oculta" el método Dispose(), pero aún permite que la instancia de clase se use a través de una instrucción using.

+0

Gracias, Reed y Dan! El primer post gana. –

2

La clase Channel implementa explícitamente la interfaz ICommunicationObject. He aquí un ejemplo que demuestra la diferencia entre la implementación de interfaz explícita e implementación de la interfaz implícita:

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 
    } 
} 

Aquí hay un enlace a un artículo del MSDN sobre este tema: http://msdn.microsoft.com/en-us/library/ms173157.aspx

Cuestiones relacionadas