2010-02-22 12 views
9

Como el título implica, trato de entender por qué en WCF a veces las personas eligen "generar proxies" en vez de usar ChannelFactory para crear nuevas instancias de canales manualmente. He visto ejemplos de cada uno, pero realmente no he encontrado ninguna explicación de POR QUÉ elegirías uno frente al otro.Uso directo del canal vs uso de un proxy?

Para ser honesto, sólo hemos trabajado con los canales y el código de ChannelFactory<T> he heredado, es decir:

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

_duplexSessionChannel = channelFactory.CreateChannel(endpointAddress); 

Así que por qué iba a "generar un proxy"? ¿Cuáles son los beneficios y desventajas?

Respuesta

17

La principal diferencia es la siguiente:

  • generar un proxy sólo requiere saber la URL donde reside el servicio. Al generar el proxy, todo lo demás (el contrato de servicio y los contratos de datos involucrados) se determinará inspeccionando los metadatos del servicio

  • para crear directamente un ChannelFactory<T>, debe tener acceso directo al ensamblaje que contiene ese contrato de servicio T para el cual está generando una fábrica de canales. Esto solo funciona si básicamente controla ambos extremos del canal y puede compartir el conjunto que contiene esos contratos de servicio. Normalmente, con un servicio de terceros, este no será el caso, con sus propios servicios, sí.

El segundo punto importante es la siguiente:

  • crear un proxy generado básicamente hace los dos pasos que usted haría - crear un ChannelFactory<T>, y de eso, crear el canal real - en una solo constructor. Usted no tiene control sobre estos dos pasos.

  • haciendo su propia creación de canales es beneficioso, ya que la creación del ChannelFactory<T> es el paso costoso, por lo que podría almacenar en caché la instancia de fábrica de su canal en alguna parte. Crear y re-crear el canal real de la fábrica es mucho menos complicado paso que se puede hacer con más frecuencia

Así que si lo hace el control de ambos extremos de la comunicación, el servicio y el cliente, usted tiene la opción de comparta los contratos de servicio en un ensamble separado, y así tendrá más opciones.

Con la mayoría de los servicios de terceros, simplemente no tiene esa opción.

3

El uso de un proxy es más simple y fácil de entender. Tienes que lidiar con cosas simples, clases y métodos en esas clases, en lugar de cosas complejas relacionadas con la red, como los canales.

otoh, esto no se hace más fácil por el fallo de diseño en WCF que impide que la misma simple uso de un proxy WCF que podíamos hacer con los proxies ASMX:

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

Si utiliza este patrón con WCF, puede perder la excepción original cuando sale el bloque debido a una excepción. client.Dispose() puede arrojar una excepción, que sobrescribirá la excepción originalmente lanzada. Se requiere un patrón más complejo.

+0

¿Alguna razón para el voto a favor? –

2

Esto puede ayudarle a:

Cuándo utilizar un proxy?

Si tiene un servicio que sabe que va a ser utilizado por varias aplicaciones o es lo suficientemente genérico como para ser utilizado en varios lugares, querrá utilizar las clases de proxy.

¿Cuándo usar ChannelFactory?

La clase ChannelFactory se utiliza para construir un canal entre el cliente y el servicio sin la necesidad de un proxy. En algunos casos, puede tener un servicio estrechamente vinculado a la aplicación del cliente. En tal caso, puede hacer referencia directamente a la DLL de interfaz y usar ChannelFactory para llamar a sus métodos con eso.

También podría referirse siguiente enlace para entender la diferencia entre el Canal de fábrica y la clase Proxy http://ashishkhandelwal.arkutil.com/wcf/channelfactory-over-proxy-class-in-wcf/

1

La principal ventaja de la ChannelFactory es que puede crear el proxy de forma dinámica en tiempo de ejecución sobre la marcha. Con SvcUtil (Agregar referencia web en VS) crea el proxy en tiempo de diseño, por lo que su implementación es más estática.