en C#

2011-05-17 4 views
6

tengo esta clase:en C#

class UrlManagementServiceClient : System.ServiceModel.ClientBase<IUrlManagementService>, IUrlManagementService 

ClientBase implementa IDisposable y ICommunicationObject. También tengo esta interfaz:

interface IUrlManagementProxy : IUrlManagementService, ICommunicationObject, IDisposable 

Pero no puedo emitir UrlManagementServiceClient objetos a IUrlManagementProxy. ¿Hay alguna forma de lograr esto? Quiero terminar con un objeto que pueda acceder a todos los métodos en las tres interfaces.

Respuesta

4

Solo puede transmitir contenido a las interfaces heredadas, para poder convertir a IUrlManagementProxy debe implementar esa interfaz.

class UrlManagementServiceClient : 
    System.ServiceModel.ClientBase<IUrlManagementService>, IUrlManagementProxy 

continuación, puede convertir a cualquiera UrlManagementServiceClientUrlManagementProxy, IUrlManagementService, ICommunicationObject o IDisposable.

Editar
Las clases generadas en WCF son parciales, lo que significa que puede ampliar la definición de clase en otro archivo. Ponga

public partial class UrlManagementServiceClient : IUrlManagementProxy {} 

en otro archivo de código y su clase implementará la interfaz completa IUrlManagementProxy también y, a continuación, puede echarlo a IUrlManagementProxy.

+0

UrlManagementServiceClient es un cliente WCF generado automáticamente. Me gustaría evitar ediciones manuales en el archivo en caso de que sea necesario volver a generarlo. – RandomEngy

+0

@RandomEngy, puede agregar una definición de clase parcial con su propia interfaz en un archivo separado, consulte la edición de mi respuesta. –

+0

Agradable. Limpio y simple. – RandomEngy

1

Hacer UrlManagementServiceClient implementar IUrlManagementProxy en lugar de IUrlManagementService

class UrlManagementServiceClient : System.ServiceModel.ClientBase<IUrlManagementProxy>, IUrlManagementProxy 
0

Es necesario implementar IUrlManagementProxy en UrlManagementServiceClient. No hay otra forma: es un tipo separado.

0

Obviamente, no puede transmitir un objeto a una interfaz que no implementa.

Pero, lo que puede hacer (si tiene sentido para poner en práctica todos los métodos para cada una de las interfaces de cada una instancia UrlManagementServiceClient), es envoltura su UrlManagementServiceClient en un objeto que implementa las interfaces necesarias.

Esto se llama Decorator pattern (en lugar de proxy). Por lo general, un "proxy" parece ser el objeto subyacente, mientras que en este caso está agregando funcionalidades que su cliente no tiene.

En otras palabras, se necesitaría una nueva clase:

public class UrlManagementClientProxy : IUrlManagementProxy 
{ 
    // we need a reference to the underlying client 
    private readonly UrlManagementServiceClient _client; 

    // underlying client is passed to the proxy in constructor 
    public UrlManagementClientProxy(UrlManagementServiceClient client) 
    { 
     _client = client; 
    } 

    #region IUrlManagementProxy methods 

    // you implementation goes here. if the underlying client 
    // already implements a certain method, then you just need 
    // to pass the call 

    // for example, client already implements methods 
    // from the IUrlManagementService interface, so use them 

    public string GetUrl() // made up 
    { 
      return _client.GetUrl(); 
    } 

    #endregion 
} 

Esto permite volver a utilizar la aplicación de cliente, y añadir funcionalidad adicional en la parte superior de la misma.

+0

Intenté esto, pero hay muchas cosas para implementar en ICommunicationObject y IUrlManagementService y se estaba volviendo complicado. Fui con otro enfoque. – RandomEngy

0

Para resolver esto, sólo extendió la clase y declaró la interfaz agregada en él:

public class UrlManagementProxy : UrlManagementServiceClient, IUrlManagementProxy 
{ 
    public UrlManagementProxy(Binding binding, EndpointAddress remoteAddress) 
     : base(binding, remoteAddress) 
    { 
    } 
} 

Luego uso UrlManagementProxy en lugar de UrlManagementServiceClient.

Solo necesito pasar por los constructores que necesito. Todo el resto se maneja automáticamente. También de esta manera no necesito modificar el UrlManagementServiceClient para que pueda volver a generarlo y todo seguirá funcionando.