2009-06-23 8 views
6

Por ejemplo, tengo dos servicios alojados en IIS.Dos servicios WCF con diferentes contratos pero los mismos objetos comerciales

[ServiceContract] 
public interface IDeviceService 
{ 
    [OperationContract] 
    DeviceCollection GetAllDevices(Customer customer); 

} 

[ServiceContract] 
public interface IUserService 
{ 
    [OperationContract] 
    User Authenticate(string username, string password); 

} 

Tanto el objeto Usuario que se devuelve desde la operación Autenticar en el UserService y la DeviceCollection que se devuelve desde la operación GetAllDevices en el DeviceService tienen una definición de objeto hijo del cliente. El cliente es un objeto comercial que está en el mismo ensamblaje que los objetos Usuario y Dispositivo.

Mi problema es en el cliente - cuando llamo al funcionamiento del dispositivo

userProxy.GetAllDevices(user.Customer); 

El compilador se queja con el siguiente mensaje:

Argumento 1 - No se puede convertir de UserService.Customer a DeviceService.Customer

Me puedo conectar a ambos servicios bien, es la definición del objeto del cliente que es el problema. Realmente no quiero poner las Operaciones en el mismo servicio ya que parecen vivir naturalmente en sus propios servicios. Supongo que lo que estoy preguntando es cómo otros programadores lidian con ese problema.

Saludos, Stuart

Respuesta

3

Si desea compartir un contrato de datos a través de múltiples servicios, entonces usted tendrá que compilar el contrato de datos en cuestión en su propia asamblea y luego distribuir ese conjunto al cliente.

Aunque el tipo aparece para ser el mismo, de hecho se trata de dos tipos diferentes y es por eso que está viendo el error que está viendo. Su única otra opción (aparte de un ensamblaje compartido por separado) es combinar los dos servicios en uno para que puedan compartir el contrato de datos.

+2

Además, cuando agrega la referencia del servicio, desea usar la pestaña Avanzado para especificar qué tipos se deben compartir. –

+0

Hola, el problema con la combinación de los dos servicios es que eventualmente se volverán masivos. He leído en el libro de Jual Lowrys que debe esforzarse por no tener más de 12 miembros del contrato de servicio. – Simian

+0

@Stuart - No recomendaría combinar servicios simplemente por este motivo. Confío en que sus servicios estén separados a propósito, por lo que mezclarlos no siempre tiene sentido. Solo quería asegurarme de que conocieras todas las opciones. –

0

Pensé que intentaría responder a mi propia pregunta con detalles sobre cómo había llegado esta solución. Estaba basado en un artículo en un blog article by Dan Meineck.

Es un resumen, creo que mi concepto de tener múltiples servicios para cada una de mis entidades de negocio raíz estaba equivocado.

En lugar de eso expone un único servicio que implementan varios DataContracts por ejemplo

public partial class DeviceService : IDeviceService, IUserService 
{ 
} 

Debido servicio del dispositivo se crea como una clase parcial Esto me permitió separar los servicios, así digo por separado, siguen siendo el mismo servicio pero me permitió separarlos en archivos separados y dar alguna organización estructural al servicio.

La última pieza de la aplicación fue declarar dos puntos finales en el ejemplo de definición de servicio

<service behaviorConfiguration="GPSCloudHost.DeviceServiceBehavior" name="BusinessService.DeviceService"> 
<endpoint address="Device" binding="wsHttpBinding" contract="BusinessService.DataContracts.IDeviceService"></endpoint> 
    <endpoint address="User" binding="wsHttpBinding" contract="BusinessService.DataContracts.IUserService"></endpoint> 
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 

yo no tengo experiencia en WCF suficientes para decir si esto es "correcta" solución o no, pero está funcionando como un regalo para mis requerimientos. Si alguien más tiene una mejor solución ¡me encantaría escucharla!

Cheers

+0

Eso es lo que hago ... pero quiero compartir los contratos de servicio en el cliente y el servidor, aunque creo que tal vez esté equivocado. –

0

Es un problema semántico. Si quiere definir un UserService.Cliente y DeviceService.Customer como semánticamente iguales, entonces debe volver a factorizar físicamente ese contrato de datos en un ensamblaje separado. Alternativamente, si desea definir UserService.Customer y DeviceService.Customer como semánticamente diferentes, guárdelos como tipos separados y escriba una función de utilidad para traducir de uno a otro.

+0

Quiero que sean semánticamente iguales, ya que en el dominio el Dispositivo. Cliente y Usuario.Cliente son la misma entidad. El código para la definición del servicio y los contratos están en el mismo ensamblado, lo que intenté decir es que puedo exponer estos servicios como un solo servicio, y parece que la respuesta es utilizar múltiples puntos finales en el mismo servicio. – Simian

2

Una opción sería usar AutoMapper en el cliente para convertir sin problemas de un tipo a otro. Como tienen las mismas propiedades, las asignaciones serían sencillas.

Cuestiones relacionadas