Usare i WCF Data Services con liste e entità personalizzate

di Cristian Civera, in Windows Communication Foundation,

I WCF Data Services, nati con il nome originale di ADO.NET Data Services, permettono di confenziare facilmente dei servizi che rispondono a chiamate REST e POX, e permettono la consultazione e la manipolazione di entità. Il loro ruolo sta diventando sempre più importante, grazie al processo di standardizzazione che stanno subendo attraverso l'Open Data Protocol la cui seconda versione sarà implementata nel .NET Framework 4.0 per supportare scenari più avanzati, ma che già è possibile sfruttare con la v1, con il .NET Framework 3.5.

Di fatto i WCF Data Services sfruttano la definizione e l'implementazione di un servizio base e generico che vuole il contesto da interrogare e manipolare. Solitamente si sfrutta un ObjectContext di ADO.NET Entity Framework, ma questo non è strettamente necessario. E' possibile infatti utilizzare un provider che sfrutta la reflection per ottenere le entità, il tutto semplicemente associando una classe personalizzata. In questo modo è possibile decidere di creare DTO e un sotto insieme delle entità da offrire tramite il servizio, rispetto all'intero domain model.

Bisogna quindi prima di tutto preparare una classe che contenga proprietà in lettura che restituiscono IQueryable<T>. In questo modo il motore può applicare poi le query di filtro, di ordinamento e di aggregazione. Tale interfaccia è implementata da LINQ to Entities, da LINQ to SQL, dai molti altri provider di terze parti e anche da normali collezioni che si possono avere in memoria chiamando l'extension method AsQueryable. Nello script seguente è mostrato come definire quindi una classe Products con una proprietà All per restituire un ipotetica lista di prodotti.

public class Products
{

  public IQueryable<Product> All
  {
    get
    {
      return Enumerable.Range(1, 50).Select(n => new Product
      {
        ID = n,
        Name = "Prodotto " + n,
        Rating = (byte)(n / 50d * 5d)
      }).AsQueryable();
    }
  }

}

La classe Product è un DTO che come unico requisito deve avere l'attributo DataServiceKey per indicare quale proprietà funge da chiave identificativa. Ecco come la classe è definita.

[DataServiceKey("ID")]
public class Product
{
  public int ID { get; set; }

  public string Name { get; set; }

  public byte Rating { get; set; }
}

Non resta che usare la classe peronalizzata all'interno del servizio e dare il permesso di accesso alla proprietà All.

public class ProductsService : DataService<Products>
{

  public static void InitializeService(IDataServiceConfiguration config)
  {
    config.SetEntitySetAccessRule("All", EntitySetRights.AllRead);
  }
}

Ponendo che il servizio si chiami ProductsService.svc è possibile accedere alla lista dei prodotti mediante l'URI http://mioSito/ProductsService.svc/All.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi