4 pagine in totale: <<Indietro 1 [2] 3 4 Avanti >>
I passi da seguire
Concettualmente, la scrittura di un provider LINQ si può suddividere in questa sequenza di operazioni elementari.
- La creazione di un tipo per rappresentare i dati ritornati dal web service e di una classe che incapsuli l'interazione con il servizio (niente di nuovo sotto il sole – basta aggiungere il riferimento in VS e scrivere una classe che chiami il web service con i parametri estratti dalla query e importi i risultati ottenuti dal web service nella classe che rappresenta i risultati).
- Implementazione delle interfacce richieste da LINQ, IQueryable<T> e IQueryProvider (molto boilerplate code).
- La definizione di una classe query context che coordina il parsing delle espressioni, l'estrazione dei parametri, la chiamata al web service ed il ritorno dei risultati della query.
- Per eseguire le operazioni definite dal query context, occorre definire una classe che generi l'espressione che rappresenta la chiamata più interna al metodo Queryable.Where e che sappia come passare questi parametri nella request del web service (in parole povere, implementare il legame tra la sintassi della clausola where elementare nel nostro dominio in LINQ e l'implementazione effettiva dell'operazione di recupero dati; nel nostro caso la chiamata al web service)
- Per fare questo occorre creare una classe che supporti il query expression tree per il nuovo dominio e che sappia come attraversare l'expression tree (molto più facile a farsi che a dirsi).
- Utilizzo di una classe del query analyzer per fare l'evaluation parziale del query expression tree. Questo passaggio è necessario poiché converte in valori tutti i riferimenti alle variabili locali nella query LINQ.
Più avanti, vedremo come si può scrivere facilmente una piccola applicazione che faccia il test del nostro provider.
Il cuore di questo esperimento sarà integrare le chiamate ad un web service con il sistema che gestisce gli AST (Abstract Syntax Tree) di LINQ. In pratica, LINQ mette a disposizione un parser di espressioni ed i mezzi per interagire con esso per eseguire operazioni basate sulla valutazione delle espressioni. Nel nostro caso, per esempio, parametri come le keyword da mandare al web service o il tipo di query per Live Search sono parametri di input speciali.
Implementare IQueryable<T> e IQueryProvider
Questa fase non ha molto di creativo. Occorre definire una classe che implementi IQueryable<T> (o IOrderedQueriable<T> se si vuole definire un concetto di ordine e sorting nelle risposte). Molto di questo codice può essere copia/incolla dall'esempio di MSDN.
La classe avrà due costruttori, uno senza parametri che viene chiamato dal client per creare un data source, uno che prende come parametro un query provider, del tipo che definiremo, ed una espressione; questo costruttore viene chiamato da Provider.CreateQuery().
IQueryable deriva a IEnumerable e questo è molto importante da ricordare poichè è sempre possibile enumerare il contenuto di un IQueryable.
Per quanto concerne l'implementazione di IQueryProvider, il punto chiave è notare come la logica specifica del data source, per il quale si sta abilitando LINQ, sia catturata interamente dagli oggetti specifici usati nell'implementazione dell'interfaccia. Il codice di un IQueryProvider sarà quasi sempre lo stesso eccetto i tipi sui quali invoca CreateQuery ed Execute (rispettivamente la classe che implementa IQueryable e il Query Context del dominio specifico).
Creare un oggetto che rappresenti il risultato
Questa classe cattura i dati scambiati da e verso il web service; partiremo da questa struttura:
public class LiveSearchResult
{
public string Title { get; set; }
public string Description { get; set; }
public string Url { get; set; }
public string SourceType { get; set; }
public string QueryTerms { get; set; }
public string CultureInfo { get; set; }
internal LiveSearchResult (string title, string description, string url, string queryTerms, string sourceType, string cultureInfo)
{
QueryTerms = queryTerms;
Title = title;
Description = description;
Url = url;
SourceType = sourceType;
CultureInfo = cultureInfo;
}
}In questa struttura, QueryTerms, CultureInfo e SourceType rappresentano gli input al servizio e controllano rispettivamente le keywords, la lingua in cui la ricerca verrà effettuata e quale tipo di ricerca effettuare (siti web, immagini, video, notizie, correzione ortografica, pagine gialle, latitudine e longitudine dato un toponimo). Title, Description e Url sono invece i parametri di output dal servizio.
4 pagine in totale: <<Indietro 1 [2] 3 4 Avanti >>
Contenuti dell'articolo
- Pagina 1
- Pagina 2
- Pagina 3
- Pagina 4
Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.





Difficoltà

Stampa
Download 



