Una brevissima introduzione: i contratti di servizi WCF scambiano dati col client tramite classi serializzabili. Gli argomenti e i valori di ritorno dei metodi dei servizi potranno quindi essere dei Value Type oppure delle classi decorate, per esempio, con gli attributi DataContract (classi) e DataMember (proprietà dei DataContract).
Supponiamo di aver definito una base di servizi contenente due servizi che usano come DataContract alcune classi definite in un altro assembly che potrebbero essere le Entity di EF piuttosto che dei DTO creati ad hoc.
Se aggiungiamo una Service Reference alla nostra applicazione, noteremo che all'interno del codice generato sul nostro client vengono create delle implementazioni dei nostri DataContract: ovvero, siccome il client non conosce le implementazioni effettive dei DataContract, se le crea. Così facendo però, se aggiungiamo una seconda Service Reference al client, le implementazioni verranno ricreate tutte. Il succo è che sul server i due servizi condividevano i DataContract sul client si troveranno a lavorare con DataContract diversi.
Se la nostra scelta è quella di scambiare direttamente le Entity questo comportamento potrebbe non piacerci; anche se usiamo dei DTO potrebbe non piacerci, perchè potremmo aver condiviso sul server alcuni DTO tra i vari servizi per evitiare il moltiplicarsi di classi all'interno del nostro progetto. Per ovviare a questo problema è sufficiente aggiungere sul client un riferimento all'assembly contenente la definizione dei DataContract scambiati.
Al momento della creazione della Service Reference, cliccando sul tasto Advanced possiamo accedere a questa finestra di configurazione:
Di default l'opzione evidenziata è selezionata. In questo modo possiamo decidere se utilizzare o meno direttamente le implementazioni dei DataContract presenti nell'assembly referenziato dal client.
Matteo