Silverlight 3 e i .NET RIA Services – parte 1

I .NET RIA Services (attualmente in Preview rilasciata dopo il MIX09) sono molto interessanti per chi scrive applicazioni e vuole esporre entità tramite servizi e poi consumarle da Silverlight 3. Pensiamo ad esempio ad una piccola applicazione, costruiamo lo strato di accesso ai dati con Entity Framework, vogliamo poi costruire uno strato di servizi per esporre gli stessi dati ad un’applicazione silverlight 3.

Requisiti

Per seguire il mio esempio dovete avere installato:

Attenzione: se sulla vostra macchina sviluppate anche con Silverlight 2, usate una macchina virtuale per Silverlight 3 beta, perchè dopo l’installazione dei tool la macchina sarà configurata per questa versione di Silverlight, la 3 appunto e non vi sarà supporto per creare progetti Silverlight 2.

Esempio

Creiamo un nuovo progetto Silverlight 3,  potete anche usare il nuovo template Silverlight Navigation …

image

Nella maschera successiva, lasciate impostato il flag “Link to ASP.NET server project”. Questo creerà un legame tra il nostro servizio e l’applicazione client (Silverlight) generando ad ogni compilazione delle classi per Silverlight ed il relativo modello che permetteranno l’interazione con la corrispondente parte lato server.

image 

Creiamo uno strato di accesso ai dati

Ora al nostro progetto aggiungiamo un semplice strato di accesso ai dati fatto con Entity Framework, usando northwind e prendendo la tabella Customers, che creerà la corrispettiva classe, immagino fino a qui sia più o meno tutto noto e le immagini seguenti siano esplicative:

image

image

Nel disegno futuro potrete usare qualunque tecnologia per lo strato di accesso ai dati usata insieme ai .NET RIA Services: LINQ to SQL, vari ORM, semplici oggetti .NET etc, etc.

Creiamo ora il mid-Tier usando i RIA Service

Ora, sempre sul progetto web, che contiene ora il nostro file.edmx, possiamo aggiungere un DomainDataService. Questo nuovo template per VS 2008:

  • crea un servizio REST-based, rendendo possibili operazioni CRUD sulla nostra sorgente dati.
  • ci permette di esporre i metadati relativi alle nostre entità. Questi possono essere molto utili in caso volessi aggiungere delle regole di validazione sul modello stesso dei dati (vedete dopo).

Quindi, Add New Item, selezionare Domain Service Class, chiamiamo il nostro servizio ad esempio CustomersService, ad esempio

image

Ora nella schermata seguente abbiamo la possibilità di selezionare le Entità e se abilitare la modifica su queste, questo creerà dei metodi di Update, Insert e Delete. Inoltre selezionate il flag per creare la classe dei metadati, che ci servirà dopo per la validazione.

image

l’opzione Enable Client Access è importante: questa crea il legame tra il mid-tier, il nostro progetto web che espone dati, ed il progetto Silverlight 3. Ogni volta che compilo l’applicazioni vengono create delle classi proxy, che si mappano sul modello.

Le classi lato server

Sul server ora vengono create due classi, la prima customerModel, contiene i metoti per ottenere/inserire/modificare e cancellare i nostri customers, le entità del nostro modello:

image

la classe CustomersModel.metadata.cs contiene i metadati relativi

Le classi lato client: Silverlight

Se compiliamo il progetto, vengono prodotte in automatico delle classi proxy, per vederle in Visual Studio, possiamo usare il bottone per visualizzare tutti i file:

image

Scriviamo il codice dell’applicazione Silverlight 3

Ora, per renderci conto di come usare i RIA Services (un primo modo per la verità), inseriamo una semplice DataGrid nel progetto Silverlight e poi scriviamo il codice seguente nel file di code-behind:

image

image

Se lancio l’applicazione ho i dati visualizzati nelle griglia:

image

il metodo LoadCustomers è il corrispondente metodo associato al metodo GetCustomers definito a livello di servizio. I RIA Services usano questa convenzione nella nomenclatura, che comunque può essere personalizzata e/o modificata usando l’attributo [Query] sul metodo del Servizio.

Nella prossima parte ci occuperemo di:

  • filtraggio, ordinamento, paginazione
  • nuovi controlli RIA
  • validazione
  • operazioni CRUD

Comments

  • Anonymous
    April 17, 2009
    PingBack from http://microsoft-sharepoint.simplynetdev.com/silverlight-3-e-i-net-ria-services-%e2%80%93-parte-1/

  • Anonymous
    April 17, 2009
    Ottimo post, complimenti. Silverlight sta facendo passi grandi, sta diventando un ottimo strumento, molto interessante.

  • Anonymous
    April 20, 2009
    Nel primo post di questa serie avete visto un piccolo esempio di come costruire uno strato di mid-tier

  • Anonymous
    April 27, 2009
    Questo post conclude il piccolo esempio con cui è possibile sperimentare l’uso di Silverlight 3 insieme

  • Anonymous
    September 27, 2009
    Ciao Pietro, grazie per il tuo ottimo post. Solo una domanda? Il mio oggetto CustomersModel non ha il metodo LoadCustomers! Non dovrebbe essere generato automaticamente?

  • Anonymous
    September 27, 2009
    Ciao luca, l'esempio si riferiva alla CTP di giugno, in quella di luglio, il modello di programmazione è leggeremente cambiato e il codide che devei scrivere è diverso. productsGrid.ItemsSource = _catalog.Products; var query = from p in _catalog.GetProductsQuery()            where p.ProductSubcategoryID == 1            select p; _catalog.Load(query); Dovrei in effetti aggiornare il post :-) ma se scarichi la guida che vine con la CTP di Luglio trovi gi esempi di codice da cui partire

  • Anonymous
    November 02, 2009
    Ciao Pietro, grazie per l'immediatezza nella tua risposta. Ho un quesito che non riesco a risolvere, sicuramente puoi aiutarmi: E' possibile far sì che i dati caricati nel Datagrid attraverso RIA Service vengano automaticamente aggiornati quando la base dati viene modificata, in modo da tenere la UI sempre ed automaticamente allineata con la base dati lato server. Grazie

  • Anonymous
    November 02, 2009
    Un meccanismo di notifica al contrario, dal servizio alla UI, mi sa che è difficile da mettere in piedi. Richiederebbe implementare una call-back dal server verso il client o qualche meccanismo di polling del client vero il server.

  • Anonymous
    November 04, 2009
    HO UN PROBLEMA: ho installato Studio 2010 beta e di conseguenza Silverlight 3 . Ho creato un'applicazione web usando asp. Mando in esecuzione e il server ASP.net Development Server mida il seguente errore:Error: Unhandled Error in Silverlight Application Code: 2104 Category: InitializeError Message: Could not download the Silverlight application. Check web server settings come devo fare per fare il debug in questo malefico Silverlight? Grazie a tutti

  • Anonymous
    November 04, 2009
    Stai usado IIS o il developer server di VS ? Guarda qua se risolve: http://forums.silverlight.net/forums/t/111126.aspx

  • Anonymous
    November 12, 2009
    Pietro ti disturbo per un altro problema: Io ho un RIA Service che espone una View del mio DB (ovviamente in sola lettura). Nel mio DomainService ho quindi: public IQueryable<ChiusiAgr> GetSerieCartelliniEvasiArg(){            var q = this.Context.ChiusiAgr;            return q; } Lato silverlight effetuo il caricamento dei dati così: ctx.Load<EmessiAgr>(ctx.GetSerieCartelliniEmessiArgQuery(), MergeOption.OverwriteCurrentValues, dsEmessi_LoadedData, null) private void dsEvasi_LoadedData(LoadOperation<ChiusiAgr> lo)        {            IEnumerable<ChiusiAgr> chiusi = lo.Entities;        } Non mi riesco a spiegare perchè mentre la variabile q lato server sia correttamente valorizzata, lato client la variabile chiusi è vuota!! Hai qualche idea sul cosa possa causare questo comportamento. Grazie.

  • Anonymous
    November 29, 2009
    Ciao, sto cercando di utilizzare il tuo esempio per imparare ad utilizzare i RIA service con Silverlight 3. Sto utilizzando il database di esempio AdventureWorksLT2008R2 ma dopo avere aggiunto correttamente l'ADO.NET Data Model e passo alla costruzione del mid-Tier con l'inserimento del Domain Service Class nell'opzione "Available DataContexts/ObjectContexts" non posso selezionare nulla se non "empty domain service class". Hai un'idea sulla causa del mio problema? Grazie mille

  • Anonymous
    November 29, 2009
    Ciao è da poco stata rilasciata la versione beta dei RIA Service ? Cosa sti usando ? Probabilmente comunque devi prima compliare il progetto, fai un rebuild all, POI aggiungi il template dei Domain Service, di solito è lì il problema.

  • Anonymous
    November 29, 2009
    ciao, avevi ragione bastava fare il rebuild della solution. Comunque stavo usando l'ultima versione dei .NET RIA Services (novembre 2009). Grazie mille

  • Anonymous
    March 02, 2010
    Grazie mille per l'esempio, è perfetto. A questo punto avrei bisogno di cambiare la connection string a runtime (cioè spingendo un bottone nel file mainpage.xaml). Ho cercato e cercato ma le soluzioni che ho trovato in giro (per esempio questa http://forums.silverlight.net/forums/p/121357/276323.aspx) non mi funzionano. Hai qualche esempio? Grazie mille.

  • Anonymous
    March 05, 2010
    Ciao Pietro, potresti postare una demo di questo tutorial?? Grazie in anticipo!! Ciaoo

  • Anonymous
    December 16, 2010
    Informazioni eccellente, continuate così grande. <a href="http://www.eurograndcasino.biz"></a>

  • Anonymous
    September 15, 2011
    Ciao Pietro, so che deve essere banale, ma non riesco nel Main Page a istanziare CUstomerModel : CustomerModel contex = new CustomerModel(); Continia a non riconoscermi "CustomerModel". Cosa canno?? :)  grazie