L'introduzione di LINQ nel .NET Framework 3.5 apre la porta a un nuovo mondo per quanto riguarda l'accesso ai dati. Ora che le operazioni sugli insiemi di dati e la connessione alla loro sorgente non sono più un'entità a sè stante separata dal resto della logica dell'applicazione e delle librerie, è possibile raggiungere un livello di astrazione e integrazione nell'accesso ai dati senza precedenti.
Oggi è possibile dire:
from results in MyDB where results.Keyword = "paolo rossi 1982" && results.Source="Image" && result.CultureInfo="it-it" select new {results.Title, results.Description, result.Url};
Tutto questo, senza doversi preoccupare se myDB è un database o un file XML. Quello che questo articolo esplora, è il fatto che chiunque si può scrivere un provider LINQ per accedere alla propria sorgente dati. Quando avremo finito, il codice qui sopra potrà essere usato per ricevere da Live Search i primi dieci siti contenenti video di Paolo Rossi nel 1982.
Interrogare Live Search da un'applicazione
Live Search è l'unico dei grandi motori di ricerca a consentire l'accesso programmatico attraverso un web service SOAP a chiunque. Una volta ottenuto un AppID, visitando questo sito, è possibile scaricare l'SDK e generare, gratuitamente, un traffico fino a 25.000 query al giorno per applicazione (750.000 query al mese).
Scrivere codice che parla direttamente con il servizio SOAP è un'operazione alquanto tediosa. Visual Studio genera per noi il codice di un proxy, a partire dal file WSDL (Web Service Description Language), che consente di tradurre chiamate locali ad un oggetto in chiamate al metodo web e di gestire il passaggio dei dati.
Per aggiungere un riferimento al web service, occorre cliccare con il tasto destro sul nodo del progetto in VS e selezionare "Add Service Reference". Il WSDL del servizio è disponibile a questo indirizzo.
Per ragioni di retrocompatibilità, il servizio si chiama ancora MSNSearchService.
Il servizio implementa un metodo Search che riceve in input un oggetto di tipo SearchRequest. Per utilizzare il servizio, occorre costruire quest'oggetto complesso che contiene, oltre alla query per il motore di ricerca, anche parametri quali la CultureInfo, la lista dei servizi da interrogare (web, immagini, video, notizie, ecc.) e alcuni parametri caratteristici di ciascuno di questi.
Un'operazione come estrarre dati da un motore di ricerca si presta poco alla metafora di una request/response. Un motore di ricerca è concettualmente più vicino ad un data source che non ad un oggetto che esponga metodi per interagire con esso.
Sarebbe molto più elegante, oltre che meno soggetto ad errori, poter interrogare il motore di ricerca con un linguaggio di query standardizzato come LINQ. Il tutto, senza contare che questo isolerebbe ogni dipendenza dal back end in un unico punto (il provider LINQ).
Considerato che nel caso particolare di Live Search l'operazione è una lettura di dati, un LINQ provider che astrae la presenza di SOAP ed espone solo il fatto che l'applicazione legge dati da un data source remoto sembra una buona architettura; sarà sempre possibile modificare il data source con una minima variazione del codice.
In questo esempio, scriveremo un provider LINQ che incapsula completamente la chiamata al web service di Live Search e che espone il motore di ricerca all'applicazione che lo utilizza come se fosse un database qualunque.
Prima di cominciare...
Questo articolo descrive come estendere LINQ, un argomento non fatto per principianti. Per seguire i dettagli dell'implementazione, è necessaria una minima dimestichezza con l'uso di un web service in Visual Studio e con alcuni concetti fondamentali della programmazione in .NET (web reference, rudimenti di WCF, il concetto di interfaccia, fondamenti dei componenti di LINQ ed in particolare avere chiaro il concetto di expression tree).
Ovviamente, LINQ è una nuova feature di Visual Studio 2008. Averne una versione installata (per esempio una versione Express) è il prerequisito per sperimentare le idee di questo articolo.
La documentazione ufficiale
Chiunque si cimenti con lo scrivere un provider per LINQ troverà le informazioni fondamentali nel documento di MSDN Attivazione di un'origine dati per l'esecuzione di query LINQ. Molto del codice dell'esempio di MSDN potrà essere utilizzato direttamente in molti casi.
L'obiettivo di questo articolo non è di riscrivere l'esempio di MSDN, ma di renderlo digeribile e comprensibile e di dare un'idea chiara di dove passare a LINQ sia un beneficio per l'utente del data source.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.