2011-03-08 14 views
5

Estoy seguro de que esto debe ser un problema bastante común. Tengo dos servicios WCF, que básicamente exponen acceso estándar y acceso de administrador a un servicio más grande.Convertir el tipo de un servicio de WCF

Hay un método similar Foo en cada servicio. Foo toma un argumento del tipo TemplateInfo que se define en mi servicio.

En mi cliente tengo una referencia a Client y AdminClient. Client.Foo(TemplateInfo) espera Client.TemplateInfo mientras que AdminClient.Foo(TemplateInfo) espera AdminClient.TemplateInfo. Sé que una vez que se llega al servicio Client.TemplateInfo y AdminClient.TemplateInfo son lo mismo.

Estoy tratando de averiguar cómo crear una instancia de TemplateInfo y/o convertirlo a trabajar con los métodos de cliente y de administración. Hay una cantidad decente de código para crear este objeto, así que esperaba no duplicarlo para cada tipo.

Los tipos se definen en conjuntos compartidos y estoy "Reutilizando tipos" en mi proxy. Pero obtengo los dos tipos diferentes porque tengo dos referencias de servicio.

Sería grandioso hacer algo como (AdminClient) TemplateInfo, pero quizás crearé un método clónico para convertir los tipos.

Respuesta

4

No hay forma de hacerlo. Son diferentes tipos.

Puede poner ese tipo en una biblioteca de clases que sea referencia tanto por parte del servicio como por parte del cliente. Puede indicar "Agregar referencia de servicio" para reutilizar los tipos (es el valor predeterminado), y luego será el tipo de la biblioteca de clase que se utiliza.


Tenga en cuenta que la aplicación del cliente también deberá hacer referencia a la misma biblioteca de clases que los dos servicios.

+0

Gracias, esa última nota es clave en mi escenario. Ya lo estoy haciendo referencia en los dos servicios. – earthling

+0

@John, ¿podría ayudar aquí http://stackoverflow.com/questions/43506726/wcf-deserializing-choosing-type-in-depends-on-some-field-once-and-for-all-de por favor? –

1

Genere una referencia de servicio, puede colocar tipos de servicio en un ensamblado compartido entre el cliente y el servicio, y marque "Reutilizar tipos en ensamblados a los que hace referencia" o algo así mientras genera la clase de cliente.

1

Puede hacerlo, pero en general no se considera una buena idea. La razón es que combina estrechamente a su cliente y sus servicios. Solo considere hacer esto si tiene el control del cliente y de ambos servicios, y está preparado para el hecho de que cuando implemente un cambio en uno de los servicios podría romper el cliente.

Richard me ha golpeado con algunos consejos sobre cómo hacer esto si está usando Visual Studio.

Pero

Uno de los principales principios de la arquitectura orientada a servicios es "esquema de compartir servicios y el contrato, no la clase".

Hay muchos buenos artículos que explican esto mejor que yo. Wikipedia es un buen comienzo o existe este artículo de cuando WCF tenía un nombre genial. http://msdn.microsoft.com/en-us/magazine/cc164026.aspx

+0

Entiendo tu punto. Esto es para algunas pruebas funcionales dentro de la misma solución que los dos servicios.Creo que habrá otros cambios que tendré que hacer en el nivel de servicio para habilitar la funcionalidad similar entre los servicios. – earthling

Cuestiones relacionadas