Accesso ai dati in Silverlight 2.0

di Alessio Leoncini, in Silverlight 2.0, 30 settembre 2008

6 pagine in totale: <<Indietro 1 2 3 [4] 5 6 Avanti >>

Web Services

Come abbiamo visto la presenza di LINQ to XML garantisce un punto privilegiato agli infoset XML come contenitori di informazioni di ogni tipo, abbiamo visto come l'approccio a questo tipo di strutture sia semplice e al tempo stesso flessibile ma è abbastanza evidente che l'utilizzo di un file XML richiede una gestione manuale di valori e dei nodi, nonostante l'efficiente aiuto di LINQ sia per il client che per il server. Per migliorare questo modello di lavoro è possibile ottenere un livello più elevato di robustezza della gestione dei dati attraverso l'utilizzo dei Web Service WCF o ASP.NET (asmx).

  • ASP.NET Web Services

Gli sviluppatori ASP.NET troveranno molto semplice realizzare un web service (ASMX) compatibile con Silverlight così com'è altrettanto semplice l'utilizzo attraverso tool come Visual Studio; cercando di confrontare le soluzioni questo potrebbe essere il codice di un semplice web service per restituire gli elementi di un menu:

[WebService(Namespace = "http://silverlightitalia.com/accessoaidatisilverlight2/services/")] 
public class MenuWebService : System.Web.Services.WebService 
{ 
    [WebMethod] 
    public List<MenuDataItem> GetItems() 
    { 
        List<MenuDataItem> items = new List<MenuDataItem>(); 
 
        MenuDataItem item1 = new MenuDataItem(); 
        item1.text = "ASPItalia.com"; 
        item1.fontSize = 32d; 
        item1.foreground = "#FF0000FF"; 
        item1.url = "http://www.aspitalia.com"; 
        item1.target = "_blank"; 
 
        items.Add(item1); 
 
        //codice per altri elementi 
         
        return items;        
 
    } 
}

Semplificando è possibile dire che un web service è una classe che eredita da System.Web.Services.WebService la quale espone i propri metodi all'interrogazione remota, il metodo GetItems() diventa accessibile attraverso la decorazione con l'attributo WebMethod, il resto del codice è un semplice popolamento di una Generic List di oggetti creati per lo specifico impiego di essere l'elemento di trasporto delle informazioni.
La costruzione di questa lista può avvenire anche attraverso l'estrazione di dati da un database in modo tradizionale.

MenuDataItem infatti è un cosiddetto DataTransfer Object (DTO), esso non implementa nessuna logica eccetto quella di avere le proprietà accessibili e serializzabili per essere semplicemente un oggetto di trasferimento delle informazioni:

public class MenuDataItem 
{ 
    public string text { get; set;} 
    public double fontSize { get; set; } 
    public string foreground { get; set; } 
    public string url { get; set; } 
    public string target { get; set; } 
} 

Questo semplice web service può essere utilizzato con l'aiuto di Visual Studio effettuando "Add Service Reference" direttamente dal progetto Silverlight, in questo modo il tool crea per noi una classe proxy al servizio completa di tutti i metodi anche nelle corrispondenti versione asincrone con tutti i relativi eventi indispensabili nell'ambito Silverlight, viene creato anche il file di configurazione con le informazioni di URL e nell'esempio anche una copia locale del DTO MenuDataItem.

Questa procedura tra l'altro ha particolare riguardo verso Silverlight in quanto consente la scelta di utilizzare come classe per le collezioni la ObservableCollection che risulta molto utile negli scenari di DataBinding, nei quali alla variazione di un valore della collezione viene automaticamente generato un evento.

Anche se il codice prodotto dal tool può apparire prolisso e suscettibile di ottimizzazione è veramente utile per consumare velocemente un web service o anche per comprendere tutte le componenti che devono essere presenti in questo genere di procedure.

Una volta prodotta la classe proxy l'utilizzo è veramente semplice:

public MenuHyperLinkFromASMX() 
{ 
    InitializeComponent(); 
 
    MenuWebService.MenuWebServiceSoapClient menuService = new MenuWebService.MenuWebServiceSoapClient(); 
 
    menuService.GetItemsCompleted += new EventHandler<MenuWebService.GetItemsCompletedEventArgs>(menuService_GetItemsCompleted); 
    menuService.GetItemsAsync(); 
} 
 
void menuService_GetItemsCompleted(object sender, MenuWebService.GetItemsCompletedEventArgs  
e) 
{ 
    ObservableCollection<MenuWebService.MenuDataItem> items = e.Result; 
 
    if (!e.Cancelled && e.Error == null) 
    { 
        foreach (MenuWebService.MenuDataItem  
item in items) 
        { 
            HyperlinkButton  
link = new HyperlinkButton(); 
            link.Content  
= item.text; 
            link.NavigateUri  
= new Uri(item.url); 
            link.FontSize  
= item.fontSize; 
 
            string foreground  
= item.foreground; 
            byte a = (byte)(Convert.ToInt32(foreground.Substring(1,  
2), 16)); 
            byte r = (byte)(Convert.ToInt32(foreground.Substring(3,  
2), 16)); 
            byte g = (byte)(Convert.ToInt32(foreground.Substring(5,  
2), 16)); 
            byte b = (byte)(Convert.ToInt32(foreground.Substring(7,  
2), 16)); 
            Color color =  
Color.FromArgb(a, r, g, b); 
 
            link.Foreground  
= new SolidColorBrush(color); 
 
            Menu.Children.Add(link); 
            Menu.UpdateLayout(); 
        } 
    } 
}

Come è possibile vedere il codice è molto simile a quello illustrato con la classe WebClient, dopo aver fatto l'istanza del proxy si procede alla chiamata del metodo GetItemsAsync non prima di avere eseguito la registrazione all'evento GetItemsCompleted.

Nel metodo gestore di questo evento la proprietà Result questa volta restituisce una collezione tipizzata di oggetti MenuDataItem, in questo modo si ha a disposizione un vero e proprio oggetto attraverso cui costruire il menu.

6 pagine in totale: <<Indietro 1 2 3 [4] 5 6 Avanti >>

Attenzione: Questo articolo contiene un allegato

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.
maltra scrive:
Accesso ai dati in Silverlight 2.0

Articolo interessantissimo, veramente utile ... è servito a togliermi molti dubbi!
martedì 30 settembre 2008

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.

Segnala su: Facebook MSDN Social Twitter Digg Segnalo Technorati Stumbleupon Google Yahoo FriendFeed Delicious Furl Wikio

TUTORIALS


IN EVIDENZA
MISC