2010-01-10 10 views
5

tengo dos servicios web. Uno con funcionalidad de usuario, uno con funcionalidad de administrador. objetosProblema con WCF y múltiples espacios de nombres: compartiendo tipos de objetos en múltiples referencias de servicio

  • AdminService proporciona funcionalidad para borrar/modificar objetos Cliente
  • UserService proporciona funcionalidad para la inclusión/lectura al Cliente

:

Ambos servicios funcionan de manera efectiva con los mismos tipos de objetos, por ejemplo, Ahora en el cliente tengo dos referencias de servicio, Webservices.Admin y Webservices.User.

Si utilizo UserService para recuperar objetos del Cliente, no puedo manipularlos a través de AdminService, ya que el UserService recupera objetos del tipo Webservices.User.Customer, sin embargo, el AdminService funciona con objetos del tipo Webservices.Admin.Customer.

En el lado del servidor, ambos tipos son idénticos, solo pertenecen a diferentes espacios de nombres en el cliente.

Ahora la pregunta: ¿cómo puedo compartir tipos en diferentes referencias de servicio?

Respuesta

1

Si está controlando ambos extremos de la comunicación, y ambos extremos son solamente .NET, usted puede hacer esto:

  • poner todos sus contratos, incluyendo los contratos de datos, en una por separado "Contratos "asamblea
  • de referencia que el montaje tanto en el código de aplicación del lado del servidor, así como el código del lado del cliente

Si hace esto, al añadir las referencias de servicios, WCF encontrar y usar que compartió montaje y no crear ne w tipos para las entidades. En su caso, solo tendrá un tipo Contracts.Customer o lo que sea que esté tratando.

Esto funciona solo si controla ambos extremos del cable y tiene .NET en ambos extremos. Pero en ese caso, es una gran forma de compartir contratos, especialmente contratos de datos, tanto en el servidor como en cualquier cantidad de clientes.

+0

Sí Puedo controlar todo. Sin embargo, el cliente es Silverlight, por lo que no es posible compartir el ensamblaje del contrato (porque mis contactos de datos provienen de Entity Framework). Si el cliente es cualquier otro cliente wcf excepto silverlight, funciona sin embargo. –

+0

OK, Silverlight es un punto importante que debería haberse mencionado en primer lugar. Pero aún debería poder crear un ensamblaje de Silverlight que contenga un tipo que se serialice en la misma estructura que el Cliente de su EF, pegarlo en un ensamblaje separado y hacer referencia a ese ensamblaje común desde cualquier cantidad de partes del cliente. –

+0

@marc_s Marc, estoy teniendo el mismo problema que se describe anteriormente, sin embargo, me gustaría saber cómo voy a serializar el conjunto de Silverlight para tener la misma estructura que el ensamblado de .NET. Creé un ensamblado de SL con exactamente las mismas clases en mi cliente de Silverlight pero eso no pareció funcionar, así que supongo que lo estoy haciendo mal. – stuartmclark

1

Utilice slsvcutil para crear el proxy WCF en el cliente (suponiendo que el cliente sea una aplicación .net), haga referencia al archivo DLL que contiene sus objetos y se usará para todos los puntos finales que pasen el mismo objeto en el archivo DLL

abrir el símbolo del Estudio del sistema de Visual desde el Inicio -> Visual Studio 2008 -> Herramientas -> Visual símbolo del sistema

directorio Goto similar a

C: \ archivos de programa \ Microsoft SDKs \ Silverlight \ v3 .0 \ Tools

tipo slsvcutil y siga la sintaxis

slsvcutil http://somewcfservice:8080 /r:CommonLibrary.dll 

donde CommonLibrary.DLL es la DLL que contiene el negocio de objetos

[editar] fija el hecho de que el proyecto es un proyecto de Silverlight

2

Salida http://cgeers.com/2011/07/31/wcf-sharing-types-using-svcmap/ Al ajustar el archivo Reference.svcmap puede asegurarse de que sólo se genera una clase para cada DataContract utilizado por el diferentes referencias de servicio.

Nota: Recuerde eliminar el contenido del nodo antes de pulsar 'Servicio de actualización de referencia'

Cuestiones relacionadas