6

Jun

WCF Data Services & Proprietà custom lato client

ciao a tutti

 

i servizi OData per WCF sono molto comodi per realizzare applicazioni data-driven

e si possono avere dei risultati soddisfacenti per scenari enterprise o comunque dove il livello di funzionalità sul servizio copre gli scenari più comuni dove servono funzionalità come transazionalità, trace, audit, logiche di business, role based authorization con possibilità di filtro riga per riga

un esempio completo è scaricabile qui

 

nel caso però si voglia avere la possibilità di aggiungere delle proprietà lato client sulle nostre entità tramite l’uso delle Partial Class, WCFDS ci diviene un tantino ostico, perché il suo proxy-client serializza ogni proprietà pubblica che trova senza fare eccezione alcuna (anche usando i vari attributi in stile decorator di non-serializzazione)

l’opzione migliore è creare una partial-class del proxy-client (quello che si chiama lato client YOUR_EDM_NAME_Entities) che troviamo lato client nel namespace del Service Reference che gli abbiamo dato durante l’aggiunta dei riferimenti nel nostro progetto in VS

es:

partial class MyEDM1Entities : IDisposable

una volta esteso il proxy client con le partial class, al suo interno andiamo ad intercettare l’evento WritingEntity che scatta appunto quando WCFDS serializza l’entità

 

public SpaceEVO_CompanyEntities()
    : base(new Uri(URI_PATH))
{
    WritingEntity += new EventHandler(OnWritingEntity);
}

public void Dispose()
{
    WritingEntity -= new EventHandler(OnWritingEntity);
}

 

adesso dobbiamo scrivere il codice necessario a scorrere le proprietà serializzate e rimuovere quelle che non intendiamo serializzare

 

static void OnWritingEntity(object sender, System.Data.Services.Client.ReadingWritingEntityEventArgs e)
{
    var node = e.Data.Descendants(System.Xml.Linq.XName.Get("properties",
        "
http://schemas.microsoft.com/ado/2007/08/dataservices/metadata")).FirstOrDefault();

    //proprietà non serializzate
    //non serializzo tutte le readonly che sono proprietà calcolate
    var nonSerializedProperties = e.Entity.GetType().GetProperties()
            .Where(p => !p.CanWrite)
            .Select(p => p.Name);

    foreach (var x in node.Descendants().Where(n => nonSerializedProperties.Contains(n.Name.LocalName)).ToArray())
        x.Remove();
}

 

nel mio esempio non serializzo le proprietà readonly perchè calcolate di volta in volta

 

alla prossima

by Antonio Esposito on 6/6/2012