WCF su Compact Framework: xxxSpecified vs IsRequired

Oggi si discuteva riguardo alla questione ben descritta in questo articolo (con relative possibili gestioni).

In breve, quando si crea un riferimento ad un servizio WCF da un progetto mobile, tramite NetCFSvcUtil, se ci sono delle classi usate come DataContract con proprietà di tipo value type definite come DataMember, per ognuna di esse verrà generata anche una proprietà booleana avente nome xxxSpecified (dove xxx è il nome della proprietà), con valore di default false.
Quando si inviano i dati dal palmare al server tramite un’istanza di questa classe, per far si che i valori delle proprietà di tipo value type arrivino a destinazione occorre impostare i valori delle relative proprietà xxxSpecified a true, altrimenti la proprietà dell’oggetto che viene deserializzato nel server avrà il valore di default.
La presenza di queste proprietà xxxSpecified permette di gestire il versioning delle entità, in modo tale da non generare degli errori alla ricezione del messaggio da parte del server se il client non invia tutte le proprietà attualmente gestite dal servizio.

Se non si ha l’esigenza di gestire il versioning (es. perchè si realizzano sia il server ed il client, e si fa in modo che siano sempre allineati), si può gestire la situazione in un altro modo, utilizzando la proprietà IsRequired dell’attributo DataMember (un esempio del suo funzionamento è riportato qui).
Impostandola al valore true, quindi marcando le proprietà della classe usata come DataContract con DataMember(IsRequired = true), al momento della generazione dei proxy NetCFSvcUtil non genera più le proprietà xxxSpecified, con il vantaggio di evitare di dimenticarsi di valorizzarle a true prima di trasmettere i dati al server.

Queste due possibili gestioni alternative possono far nascere dubbi sugli effetti che si possono avere nella gestione dei dati, in particolare per le properità dichiarate come nullable type.
In realtà entrambi gli approcci non influiscono sui nullable, e ne permettono tranquillamente la gestione anche tramite un binding limitato come può essere il basicHttpBinding, quello disponibile da Compact Framework.

In conclusione, utilizzando le proprietà xxxSpecified bisogna ricordarsi di impostare a true le proprietà da trasmettere (una soluzione può essere utilizzando un costruttore definito in una partial class), viene “sporcata” la definizione della classe con queste proprietà (in certi contesti potrebbe anche dar fastidio), ma si ha il vantaggio di poter gestire il versioning; usando IsRequired, invece, è sufficiente impostarne il valore associato agli attributi DataMember.

Se avete altre considerazioni da aggiungere, i commenti sono aperti ;)

Studiare con un e-book reader

La mia esperienza con lo studio tramite e-book reader. Clicca per leggere...