WCF e DataContract condivisi

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:

WCF config

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

 

Print | posted @ martedì 18 novembre 2008 23:19

Comments on this entry:

Gravatar # re: WCF e DataContract condivisi
by imperugo at 19/11/2008 00:54

Ciao Matteo,
Giusto ciò che dici, ma per esperienza in un grande applicativo è un approccio che SCONSIGLIO sempre!
Vuoi per problematiche di deploy, vuoi perchè non è nelle best practice della service orientarion. Ma ti garantisco con il DTO è sempre la strada migliore e dal servizio è sempre meglio non far uscire nulla :).

Ciauz
Comments have been closed on this topic.