2009-06-23 16 views
6

Ad esempio, in IIS sono presenti due servizi.Due servizi WCF con contratti diversi ma stessi oggetti business

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

} 

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

} 

Sia l'oggetto d'uso che viene restituito dall'operazione autenticazione nel UserService e la DeviceCollection che viene restituito dall'operazione GetAllDevices nel DeviceService hanno una definizione di oggetto figlio del Cliente. Il cliente è un oggetto business che si trova nello stesso assieme degli oggetti User e Device.

Il mio problema è sul client - quando chiamo il funzionamento del dispositivo

userProxy.GetAllDevices(user.Customer); 

Il compilatore si lamenta con il seguente messaggio:

Argomento 1 - Non è possibile convertire da UserService.Customer a DeviceService.Customer

Posso connettermi a entrambi i servizi bene, è la definizione dell'oggetto del Cliente che è il problema. Non voglio davvero mettere le operazioni nello stesso servizio che sembrano vivere in modo naturale nei loro servizi. Immagino che quello che sto chiedendo sia come gli altri programmatori si occupano di un simile problema?

Cheers, Stuart

risposta

3

Se si desidera condividere un contratto di dati su più servizi allora si dovrà compilare il contratto di dati in questione nella propria assemblea e quindi distribuire quell'assemblea al cliente.

Anche se il tipo appare uguale a, è in realtà un due tipi distinti ed è per questo che si vede l'errore che si sta vedendo. L'unica altra scelta (diversa da un assembly separato e condiviso) consiste nel combinare i due servizi in uno in modo che possano condividere il contratto dati.

+2

Inoltre, quando si aggiunge il riferimento al servizio, si desidera utilizzare la scheda Avanzate per specificare quali tipi devono essere condivisi. –

+0

Hiya, il problema con la combinazione dei due servizi è che alla fine diventeranno enormi. Ho letto nel libro di Jual Lowrys che dovresti sforzarti di non avere più 12 membri del contratto di servizio? – Simian

+0

@Stuart - Non consiglierei di combinare i servizi semplicemente per questo motivo. Confido che i tuoi servizi siano separati di proposito, quindi non è sempre logico metterli insieme. Volevo solo assicurarmi che tu fossi consapevole di ogni opzione. –

0

Ho pensato di tentare di rispondere alla mia stessa domanda con dettagli su come avrei superato questa soluzione. Era basato su un articolo su blog article by Dan Meineck.

È una sintesi, penso che il mio concetto di avere più servizi per ciascuna delle mie entità di business root sia stato fuorviato.

Invece ho esposto un unico servizio che ha recepito diverse DataContracts es

public partial class DeviceService : IDeviceService, IUserService 
{ 
} 

perché il servizio dispositivo viene creato come una classe parziale questo mi ha permesso di separare i servizi, beh io dico a parte, sono ancora lo stesso servizio ma mi ha permesso di separarli in file separati e dare qualche organizzazione strutturale al servizio.

L'ultimo pezzo della realizzazione è stato quello di dichiarare due punti finali nella definizione del servizio ad esempio

<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" /> 

Non ho sperimentato in WCF sufficienti per dire se questo è "corretta" soluzione o no, ma sta funzionando bene per le mie esigenze. Se qualcun altro ha una soluzione migliore mi piacerebbe sentirlo!

Acclamazioni

+0

Questo è quello che faccio ... ma voglio condividere i contratti di servizio su client e server, anche se penso che sia sbagliato. –

0

E 'una questione semantica. Se si desidera definire un UserService.Cliente e DeviceService. Cliente come semanticamente uguale, quindi è necessario ridistribuire fisicamente il contratto di dati in un assembly separato. In alternativa, se si desidera definire UserService.Customer e DeviceService.Customer come semanticamente diversi, quindi mantenerli come tipi separati e scrivere una funzione di utilità per tradurre da uno all'altro.

+0

Voglio che siano semanticamente uguali, come nel dominio Device.Customer e User.Customer sono la stessa entità. Il codice per la definizione del servizio e i contratti sono nello stesso assembly, quello che cercavo di dire è come posso esporre questi servizi come un singolo servizio, e sembra che la risposta sia utilizzare più endpoint sullo stesso servizio. – Simian

2

Un'opzione sarebbe quella di utilizzare AutoMapper sul client per convertire senza problemi da un tipo all'altro. Poiché hanno le stesse proprietà, le mappature sarebbero semplici.

Problemi correlati