¿Por qué se usaría ChannelFactory para crear una instancia de un proxy WCF en lugar de una referencia de servicio?

Parece haber dos formas de crear instancias de proxies de servicio WCF descritas aquí. Mi pregunta es ¿por qué querría uno usar ChannelFactory para crear una instancia de un proxy WCF y cuáles son los beneficios de este enfoque?

He conocido a personas con una fuerte opinión sobre la segunda opción, pero no puedo entender una argumentación clara de ellos.

preguntado el 08 de noviembre de 11 a las 10:11

Explique cuál se supone que es la "segunda opción". Hay más de dos opciones para crear un proxy WCF. -

Lo intento, pero la pila no me permite publicar el enlace.

Me intriga cual es el enlace is ahora, como un usuario de 730 repeticiones debería ser más, que poder publicar enlaces. ¿Podría ejecutar el enlace a través de bit.ly, por favor, para que podamos verlo? -

Aún así, son dos opciones en el enlace ... ver primera oración. En resumen, use una referencia de servicio o use un ChannelFactory. -

@Jeremy, la pregunta es por qué querría uno usar un ChannelFactory, editaría la pregunta para que quede más claro:

3 Respuestas

La primera opción utiliza los ajustes de configuración proporcionados en el web.config / app.config archivos para crear una instancia de un proxy, sin embargo, en ciertas situaciones, no es posible poner estas configuraciones en ese archivo, por ejemplo, si su aplicación necesita usar un enlace diferente (tal vez HTTP vs Named Pipes) dependiendo del escenario, o posiblemente su aplicación no incluso tener un archivo .config.

La segunda opción ofrece mucha más flexibilidad al crear proxies para especificar programáticamente la configuración que se utilizará para cada proxy a medida que lo crea.


Para dar un ejemplo más concreto, suponiendo que desee utilizar Named Pipes para la comunicación si se comunica con la máquina local y HTTP si se comunica con un host remoto:

if (UseNamedPipes())
{
    EndpointAddress address = new EndpointAddress("net.pipe://localhost/Simple/BankService");
    return ChannelFactory<IBank>.CreateChannel(new NetNamedPipeBinding(), address);
}
else
{
    EndpointAddress address = new EndpointAddress("http://localhost:8000/Simple/BankService");
    return ChannelFactory<IBank>.CreateChannel(new BasicHttpBinding(), address);
}

respondido 08 nov., 11:14

¿Cuáles son los a ciertos situaciones? Quiero entender qué son porque no eres el peor en mencionarlos. Yurii Hohan

¿Habría alguna diferencia en términos de rendimiento cuando usamos Channel Factory? - Thomas

Si está utilizando ensamblado compartido (que es, seamos sinceros, muy conveniente si posee ambos extremos de la tubería), ambos extremos ya tienen una versión completa si la interfaz, etc. Parece redundante ejecutar la herramienta svcutil (en símbolo del sistema o mediante el IDE) solo para recuperar un contenedor de lo que ya tenemos. También funciona muy bien cuando desea codificar solo en una interfaz, no en la clase contenedora, y usar un código centralizado para obtener un canal a una interfaz en particular en una dirección determinada. En realidad, así es como uso principalmente WCF.

El enfoque de "cliente" funciona bien para servicios únicos, o donde no necesita pasar por ninguna herramienta central. También hace demostraciones muy simples.

respondido 08 nov., 11:15

¿Crea un proyecto separado para las interfaces cuando posee ambos extremos de la tubería? - Yurii Hohan

@Hohhi sí, normalmente lo pondría en una biblioteca (dll). A veces, el mismo programa es tanto cliente como servidor, pero eso es bastante raro. - Marc Gravell

tener dos proyectos y un proyecto para hosting y DI parece ser una exageración para proyectos pequeños y medianos desde mi punto de vista - Yurii Hohan

@Hohhi Solo mencioné 3 proyectos; un proyecto de cliente, un proyecto de servidor y una biblioteca de interfaz / DTO. Es casi seguro que tiene 2 de esos 3, y el tercero no es irrazonable. - Marc Gravell

¿Habría alguna diferencia en términos de rendimiento cuando usamos Channel Factory? - Thomas

Uno de los casos específicos sería al desarrollar cualquier complemento de Office o proyectos de complemento de Visual Studio en los que no tiene el archivo app.config.

Además, digamos en una organización en la que desea estandarizar ciertos enlaces y ciertos patrones de seguridad de punto final. querría crear una API que los desarrolladores puedan usar fácilmente para crear un proxy; en este caso, encapsularía toda la información de enlace usando channelfactory.

respondido 08 nov., 11:14

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.