Procedura: creare un servizio del dominio che utilizza entità definite da POCO
In questo argomento viene illustrato come utilizzare WCF RIA Services per creare un servizio del dominio che utilizza oggetti POCO (Plain Old CLR Objects). L'obiettivo è quello di indicare come si costruisce un'applicazione RIA Services molto elementare basata su POCO che spiega, in particolare, quello che si verifica esattamente quando gli strumenti (procedure guidate e finestre di dialogo) RIA Services vengono utilizzati durante i vari passaggi nella procedura. I dati serviti da POCO possono essere utilizzati per liberare un'applicazione dalle dipendenze nei database di back-end per scopi di sicurezza dei dati o portabilità oppure per scopi di test. Il codice client generato automaticamente è totalmente supportato da RIA Services con le entità definite da POCO e con Linq to SQL o Entity Framework. Il servizio del dominio RIA Services è infatti agnostico rispetto all'origine dati, pertanto questa classe POCO può essere sostituita in un secondo momento da un componente che esegue l'accesso ai dati da un'altra origine, ad esempio un database, senza modificare il servizio del dominio stesso.
Per l'esecuzione della procedura descritta in questo documento, è necessario che siano installati e configurati correttamente alcuni programmi prerequisiti quali Visual Studio 2010 e Silverlight Developer Runtime e SDK, oltre a WCF RIA Services. WCF RIA Services Toolkit non è richiesto. Le istruzioni dettagliate per soddisfare tali prerequisiti vengono fornite negli argomenti all'interno del nodo Prerequisiti per WCF RIA Services. Seguire le istruzioni fornite per i programmi richiesti prima di continuare con questa procedura in modo da evitare il maggior numero di problemi possibile.
Creare una soluzione Servizi RIA
Creare un nuovo progetto RIA Services in Visual Studio 2010 selezionando File, Nuovo e Progetto.
Viene visualizzata la finestra di dialogo Nuovo progetto.
Selezionare il modello Applicazione Silverlight dal gruppo Silverlight di Modelli installati e denominare il nuovo progetto RIAServicesPocoExample.
Fare clic su OK.
Viene visualizzata la finestra di dialogo Nuova applicazione Silverlight.
Selezionare la casella di controllo Abilita servizi RIA WCF nella parte inferiore della finestra di dialogo. Se si seleziona questa casella viene creato un collegamento RIA Services tra il progetto client e il progetto server. Per abilitare questa connessione vengono aggiunti i riferimenti seguenti al progetto client:
System.ComponentModel.DataAnnotations
System.Runtime.Serialization
System.ServiceModel.dll
System.ServiceModel.DomainServices.Client
System.ServiceModel.DomainServices.Client.Web
System.ServiceModel.Web.Extensions
System.Windows.Browser
Fare clic su OK per creare la soluzione.
La soluzione contiene due progetti: un progetto client e un progetto server.
RIAServicesPocoExample: il progetto client che contiene il codice Silverlight che si utilizza per creare il livello di presentazione.
RIAServicesPocoExample.Web: il progetto server che contiene il codice di livello intermedio.
Creare un servizio del dominio
Fare clic con il pulsante destro del mouse sul progetto server, scegliere Aggiungi, quindi Nuovo elemento.
Nell'elenco delle categorie, scegliere Web, quindi selezionare il modello Classe di servizio del dominio.
Assegnare alla classe il nome SovereignDomainService.cs (o SovereignDomainService.vb).
Fare clic su Aggiungi.
Viene visualizzata la finestra di dialogo Aggiungi una nuova classe di servizio del dominio.
Verificare che sia selezionata la casella Abilita l'accesso client.
Notare che l'unica opzione disponibile nel menu a discesa Classi DataContext/ObjectContext disponibili è l'entità <Classe di servizio del dominio vuota> e non è possibile selezionare la casella di controllo Genera classi associate per i metadati perché non sono disponibili contesti di dati a cui associare il servizio.
Fare clic su OK.
Con questa procedura guidata si possono eseguire diverse operazioni. È possibile generare una classe
SovereignDomainService
vuota in un nuovo file SovereignDomainService.cs (o SovereignDomainService.vb) con attributi e istruzioniusing
associati. Inoltre, è possibile aggiungere quattro riferimenti all'assembly agli elementi di configurazione e progetto del servizio nel file Web.config.A tale scopo, aprire il file SovereignDomainService.cs (o SovereignDomainService.vb) se è non è già stato aperto automaticamente. Notare le seguenti caratteristiche del file:
Sono state aggiunte le istruzioni
using
:using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.ServiceModel.DomainServices.Hosting;
using System.ServiceModel.DomainServices.Server
La classe
SovereignDomainService
deriva dalla classe DomainService, classe di base astratta nel framework RIA Services . Si tratta della classe di base per tutto il servizio del dominio esposto in RIA Services .La classe
SovereignDomainService
è contrassegnata dall'attributo EnableClientAccessAttribute per indicare che è visibile a livello client.
Notare che sono stati aggiunti dalla procedura guidata i riferimenti seguenti al progetto di servizio:
System.ComponentModel.DataAnnotations
System.Runtime.Serialization
System.ServiceModel.DomainServices.Hosting
System.ServiceModel.DomainServices.Server
Infine aprire il file Web.config ed esaminare i nuovi elementi aggiunti dalla procedura guidata.
<configuration> <system.webServer> <modules runAllManagedModulesForAllRequests="true"> <add name="DomainServiceModule" preCondition="managedHandler" type="System.ServiceModel.DomainServices.Hosting.DomainServiceHttpModule, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> </modules> <validation validateIntegratedModeConfiguration="false" /> </system.webServer> <system.web> <httpModules> <add name="DomainServiceModule" type="System.ServiceModel.DomainServices.Hosting.DomainServiceHttpModule, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> </httpModules> <compilation debug="true" targetFramework="4.0" /> </system.web> <system.serviceModel> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> </system.serviceModel> </configuration>
Ad eccezione dell'elemento di configurazione destinato a .NET Framework 4.0, ciascuno di questi elementi è stato aggiunto tramite la finestra di dialogo Aggiungi una nuova classe di servizio del dominio. Gli elementi abilitano diverse opzioni ASP.NET e di hosting di Internet Information Server (IIS).
Viene aggiunto l'elemento
<modules>
nella sezione<system.webserver>
richiesta dall'hosting di IIS 7.Viene aggiunto un elemento
<add>
dell'elemento<httpModules>
nella sezionesystem.web
richiesta dall'hosting di IIS 6.I servizi del dominio di RIA Services sono servizi Windows Communication Foundation (WCF) che se ospitati con ASP.NET devono essere ospitati nella modalità di compatibilità ASP.NET. Questo requisito non può essere impostato nel codice e deve essere specificato nel file Web.config. La modalità di compatibilità ASP.NET viene abilitata impostando la proprietà
aspNetCompatibilityEnabled
su true nell'elemento<ServiceHostingEnvironment>
della sezione<system.serviceModel>
.
Aggiungere la classe POCO
In questa procedura viene descritto come si indica al framework RIA Services che una classe POCO deve essere utilizzata come tipo di entità. I tipi di entità forniscono le strutture di dati al modello di dati dell'applicazione e ogni tipo di entità deve avere una chiave di entità univoca. La struttura dei dati viene specificata dal set di proprietà che contiene. La chiave di entità è fornita deputando una proprietà o un set di proprietà che deve fornire per ogni oggetto entità un nome univoco che lo distingue dalle altre entità dello stesso tipo. In genere ciò si specifica utilizzando i metadati di una certa varietà. Questa operazione viene eseguita applicando l'attributo
[Key]
a una proprietà ed è di fatto l'applicazione di questo attributo che indica al framework RIA Services che le istanze della classe POCO sono oggetti entità.Aprire il file SovereignDomainSevice.cs.
Nell'ambito dello spazio dei nomi RIAServicesPocoExample.Web, sotto la classe
SovereignDomainService
generata automaticamente, aggiungere il codice seguente per la classeSovereign
:public class Sovereign { [Key] public int UniqueId { get; set; } public string Name { get; set; } public string House { get; set; } public string Dominion { get; set; } public int ReignStart { get; set; } public int ReignEnd { get; set; } public string Sobriquet { get; set; } }
In questo esempio la proprietà
UniqueId
è la chiave di entità che fornisce un nome univoco per ogni oggetto entità di tipoSovereign
. L'attributo[Key]
è definito nell'assembly System.ComponentModel.DataAnnotations che è già stato aggiunto al progetto server come l'istruzioneusing
per lo spazio dei nomi corrispondente che lo contiene. La chiave di entità può anche essere specificata in un file di metadati o in altre modalità, ma questo è un modo conveniente per indicarla direttamente nella classe POCO.Aggiungere il metodo
FetchSovereigns()
alla classeSovereign
che restituisce un elenco di istanze diSovereign
:public List<Sovereign> FetchSovereigns() { List<Sovereign> sovereignList = new List<Sovereign> { new Sovereign() {UniqueId = 1, Name = "John", House = "Plantagenet", Dominion = "Angevin Empire", ReignStart = 1167, ReignEnd = 1216, Sobriquet = "Lackland" }, new Sovereign() {UniqueId = 2, Name = "Charles", House = "Stuart", Dominion = "England, Scotland, & Ireland", ReignStart = 1625, ReignEnd = 1649, Sobriquet = "The Martyr" }, new Sovereign() {UniqueId = 3, Name = "William", House = "Dunkeld", Dominion = "Scotland", ReignStart = 1165, ReignEnd = 1249, Sobriquet = "The Lion" }, new Sovereign() {UniqueId = 4, Name = "Elizabeth", House = "Tudor", Dominion = "England", ReignStart = 1555, ReignEnd = 1609, Sobriquet = "The Virgin Queen" }, new Sovereign() {UniqueId = 5, Name = "Ivan", House = "Vasilyevich", Dominion = "Russia", ReignStart = 1533, ReignEnd = 1584, Sobriquet = "The Terrible" }, new Sovereign() {UniqueId = 6, Name = "Charles", House = "Valois", Dominion = "France", ReignStart = 1380, ReignEnd = 1422, Sobriquet = "The Mad" } }; return sovereignList; }
Definire il servizio del dominio
In questa procedura viene descritto come si crea una query nel servizio del dominio che sarà accessibile dal client per recuperare i dati dalle entità definite da POCO. È necessario che il framework RIA Services sappia quali metodi devono essere resi disponibili sul client come query ed è necessario utilizzare a tale scopo una convenzione di denominazione. I nomi dei metodi che iniziano con
Get
e che restituiscono un elementoIEnumerable<EntityType>
o un elementoIQueryable<EntityType>
sono riconosciuti dal framework RIA Services come query.Suggerimento: IQueryable deriva da IEnumerable. Utilizzare IEnumerable per le raccolte in memoria, ad esempio le entità definite da POCO e utilizzare IQueryable quando si accede a un'origine dati sottostante o remota, come un database SQL. Aggiungere il metodo
GetSovereign()
alla classeSovereignDomainService
.public IEnumerable<Sovereign> GetSovereigns() { Sovereign sovereign = new Sovereign(); return sovereign.FetchSovereigns(); }
Vengono restituite tutte le entità sovrano della raccolta. In genere, tuttavia, si desidera venga restituito solo un sottoinsieme delle entità. A tale scopo, modificare la query in modo che vengano restituiti da questo elenco solo i sovrani che hanno regnato durante il Medio Evo, ossia
sovereign.ReignEnd
<= 1500. Il codice riportato di seguito effettua questa operazione:public IEnumerable<Sovereign> GetSovereignsByReignEnd(int ReignedBefore) { Sovereign sovereign = new Sovereign(); return sovereign.FetchSovereigns().Where<Sovereign>(p => p.ReignEnd <= 1500); }
Compilare (CTRL+MAIUSC+B) la soluzione per creare il codice del proxy client generato automaticamente.
In Esplora soluzioni selezionare il progetto client RIAServicesPocoExample, fare clic sull'icona Mostra tutti i file nella parte superiore della finestra ed esaminare il file RIAServicesPocoExample.Web.g.cs nella cartella Generated_Code. Esaminare il codice generato automaticamente in questo file e prendere nota degli elementi seguenti:
Una classe
WebContext
che deriva dalla classe WebContextBase viene generata e utilizzata per gestire il contesto dell'applicazione.Una classe
Sovereign
che deriva dalla classe Entity viene generata per l'entità esposta dal servizio del dominio. La classe dell'entitàSovereign
nel progetto client corrisponde all'entitàSovereign
nel server.Viene generata una classe
SovereignDomainContext
che deriva dalla classe DomainContext. Questa classe dispone di un metodo denominatoGetSovereignsByReignEndQuery
che corrisponde al metodo di query creato nel servizio del dominio.
Per ulteriori informazioni sulla generazione automatica del codice, vedere l'argomento Generazione del codice client. Per ulteriori informazioni sulla personalizzazione della generazione automatica, vedere gli argomenti Personalizzazione del codice generato.
Visualizzare il risultato della query nel client Silverlight
Aprire MainPage.xaml.
Dalla casella degli strumenti sulla sinistra, trascinare un controllo DataGrid nell'elemento Grid nella visualizzazione XAML.
Il trascinamento del controllo DataGrid dalla casella degli strumenti provoca l'aggiunta al file MainPage.xaml.cs di un'istruzione
using System.Windows.Controls
dello spazio dei nomi e l'aggiunta automatica al progetto client dei riferimenti agli assembly System.Windows.Controls.Data e System.Windows.Controls.Data.Input.Attenzione: Se si aggiunge DataGrid senza trascinarlo dalla casella degli strumenti, è necessario aggiungere manualmente al progetto client i riferimenti agli assembly e al file code-behind l'istruzione using. Impostare il valore di
AutoGeneratedColums
su True, assegnare il nomeSovereignGrid
all'elementoDataGrid
e modificare i valori diHeight
eWidth
come indicato nel seguente codice XAML.<Grid x:Name="LayoutRoot" Background="White"> <sdk:DataGrid AutoGenerateColumns="True" Height="200" HorizontalAlignment="Left" Margin="157,86,0,0" Name="SovereignGrid" VerticalAlignment="Top" Width="600" /> </Grid>
Aprire il file MainPage.xaml.cs.
Aggiungere due istruzioni
using
(C#) oImports
(Visual Basic):using RIAServicesPocoExample.Web;
eusing System.ServiceModel.DomainServices.Client;
.Lo spazio dei nomi RIAServicesPocoExample.Web è quello contenente il codice generato per il progetto client in RIAServicesPocoExample.Web.g.cs (o RIAServicesPocoExample.Web.g.vb).
Per creare un'istanza di
SovereignDomainContext
, aggiungere la riga di codiceprivate SovereignDomainContext _sovereignContext = new SovereignDomainContext();
nella classeMainPage
.Recuperare le entità del cliente chiamando il metodo
GetSovereignsQuery
con LoadOperation:LoadOperation<Sovereign> loadOp = this._sovereignContext.Load(this._sovereignContext.GetSovereignsByReignEndQuery(1500));
.Associare le entità caricate a DataGrid con
SovereignGrid.ItemsSource = loadOp.Entities;
.Per riassumere, il file MainPage.xaml.cs a questo punto contiene il codice seguente:
//Namespaces added using RIAServicesPocoExample.Web; using System.ServiceModel.DomainServices.Client; namespace RIAServicesPocoExample { public partial class MainPage : UserControl { private SovereignDomainContext _sovereignContext = new SovereignDomainContext(); public MainPage() { InitializeComponent(); LoadOperation<Sovereign> loadOp = this._sovereignContext.Load(this._sovereignContext.GetSovereignsByReignEndQuery(1500)); SovereignGrid.ItemsSource = loadOp.Entities; } } }
Eseguire (F5) l'applicazione.
Viene visualizzata la tabella nel browser indicando in ordine alfabetico solo le proprietà dei sovrani del Medio Evo il cui regno è terminato prima dell'era volgare del 1500).
Sicurezza
Vedere anche
Attività
Procedura dettagliata: recupero e visualizzazione di dati da un servizio del dominio