posts - 644, comments - 2003, trackbacks - 137

My Links

News

Raffaele Rialdi website

Su questo sito si trovano i miei articoli, esempi, snippet, tools, etc.

Archives

Post Categories

Image Galleries

Blogs

Links

Architetture multilayer fatte di programmazione funzionale, provider e servizi

L'ingresso di Linq nel Framework è stato prepotente. I tangibili vantaggi di Linq to Sql e le promesse delle future versioni di Entity Framework hanno scatenato una vera e propria corsa a Linq. E pensare che siamo solo alle prove tecniche di trasmissione dei concetti di programmazione funzionale dentro il Framework ...

Mi è saltata in mente un'idea balzana. Ma voglio prima partire riaffermando alcuni concetti ormai consolidati da case studies e libri di fama:

  • Le architetture multilayer sono più facili da difendere (sicurezza applicativa)
  • L'astrazione con provider è un vantaggio in termini di evoluzione dell'applicazione e di manutenibilità
  • I servizi (stateless) garantiscono un alto margine di scalabilità

Vediamo come sfruttare la programmazione funzionale in una architettura multilayer. Per esempio la UI:

  • tipicamente esegue molte operazioni di selezione di entità caratterizzate da  un certo numero di proprietà [projection]
  • ha la necessità di filtrare i risultati [restriction]
  • spesso deve paginare i risultati perché sono comunque troppi [partitioning]
  • deve anche ordinare i risultati secondo un criterio [ordering]
  • può avere bisogno di raggruppare [grouping] o di aggregare (sum, count, max, ...) [aggregation]
  • ...

Tutto questo ricorda molto gli operatori di Linq smile_regular

Il service layer da parte sua espone già un contratto che permette una astrazione rispetto il data server o comunque le risorse sottostanti. Ma la difficoltà sta proprio nel contratto che il più delle volte è "ad hoc" per la nostra applicazione. Un domani che dovessimo usare un contratto differente, dovremmo necessariamente applicare una di queste soluzioni: (a) cambiare la UI per supportare il nuovo servizio, (b) creare un nuovo servizio che "trasformi" i dati con il nostro formato, (c) usare BizTalk per piallare le differenze.

L'idea balzana è semplice:

  • usare i provider di Linq come "adapter" per lo strato dei servizi
  • i provider useranno gli expression tree (che sono serializzabili) come "linguaggio" per mappare le richieste della UI sul servizio (Expression.Call esegue un determinato metodo)
  • Le Expression.Call possono essere usate anche per le operazioni che non facciano mero retrieval di valori (per esempio insert/update/delete)
  • usare sempre gli expression tree per le restriction (And, Not, Or, etc.). [Questo non esclude di poter avere oggetti di business differenti nel presentation e nel service layer in quanto convertire un expression tree non è complesso.]
  • ...

Il vantaggio immediato è quello di ottenere un presentation veramente sterile, persino dai servizi; ...di avere una architettura a provider "gratis"; ...di avere i preziosi expression tree senza alcuno sforzo; ... di lavorare in modo strong-typed.

Sento già le ambulanze suonare ma io la vedo così...

Print | posted on martedì 29 luglio 2008 00:06 |

Feedback

Gravatar

# re: Architetture multilayer fatte di programmazione funzionale, provider e servizi

Non ho avuto purtroppo il piacere di ascoltare "the President" ai community days ma se hai un link, postalo che me lo leggo volentieri. Almeno al manicomio avrò un buon amico con cui chiaccherare :))))
Tempo fa avevo iniziato a scrivere un Linq provider da "immergere" nella mia RafCollection ... solo un test partendo dai noti post sui provider:
http://blogs.msdn.com/mattwar/archive/2007/09/04/linq-building-an-iqueryable-provider-part-vii.aspx
All'epoca (dicembre 07) mi era venuto in mente di passarmi le query expression da un tier all'altro e di usarlo nella funzione di filtro della rafcollection.

Poi nella nuova versione del tool (che ho presentato ai community days come esempio di localizzazione wpf) per cercare i messaggi di errore del framework in lingue differenti, ho usato questo predicate builder per costruire un expression tree:
http://www.albahari.com/nutshell/predicatebuilder.html
Parsare l'expression tree è banale e riscriverlo con questo builder è altrettanto banale.

Infine in questi giorni riflettevo sulla necessità di tradurre l'expression tree da una query sugli oggetti del presentation a quelli gestiti dal service layer (ok, questo è solo il peggiore dei casi ma spesso è una necessità). E pensavo ancora che alla fine dei conti un provider Linq svolge il ruolo perfetto per risolvere le situazioni che ho scritto nel post.
E quindi ho scritto... :)

IMHO MS tirerà fuori dal cappello parecchie cosette basate su tutto ciò, ma al momento non ci sono neppure i rumor quindi è pura follia del sottoscritto :)
29/07/2008 01:22 | Raffaele Rialdi
Gravatar

# re: Architetture multilayer fatte di programmazione funzionale, provider e servizi

Raf, uno dei problemi nella serializzazione degli expression tree è come fai a trattare le chiamate a operatori "fuori LINQ". In pratica, in un'espressione puoi chiamare una proprietà o un metodo di una classe. Perché ciò funzioni, è necessario poter interpretare tale chiamata dall'altro lato della comunicazione. La cosa si arena nel momento in cui vuoi pensare di gestire versioning e altre cose.
La cosa è alla base di sistemi come DryadLINQ (http://research.microsoft.com/research/sv/DryadLINQ/) dove il problema viene risolto trasferendo di peso anche gli assembly in gioco :-) opzione che chiaramente non è sempre utilizzabile, anche perché in alcuni casi potresti voler traslare l'implementazione della query LINQ tenendone ferma la semantica.
Cmq è un'area su cui c'è ancora molto da pensare oltre che da fare :-)
29/07/2008 04:24 | Marco RUsso
Gravatar

# re: Architetture multilayer fatte di programmazione funzionale, provider e servizi

Ciao Marco, io pensavo al provider Linq come bridge verso un servizio WCF (il provider parla ovviamente con il proxy) ... a questo punto provider e *contratto* del servizio vanno a braccetto e seguono lo stesso ciclo di vita. Il contratto è tipicamente più durevole e questo dovrebbe dare maggiori garanzie anche per il versioning.
In questo scenario il presentation è sempre "ignorante" sul provider utilizzato e glielo si può cambiare sotto il naso per esempio con un .config.
Ma ti do perfettamente ragione che c'è ancora tantissimo da pensare oltre che fare :)
29/07/2008 12:02 | Raffaele Rialdi
Gravatar

# re: Architetture multilayer fatte di programmazione funzionale, provider e servizi

Uno degli esempi che abbiamo fatto nel libro "Programming Microsoft LINQ" è un provider (implementazione di IQueryable) che fa da wrapper a un servizio "legacy" (che non sa niente dell'esistenza di LINQ). Se vuoi mantenere l'indipendenza dalla piattaforma, la semantica di query che fai passare nel servizio non può essere la serializzazione di LINQ tale e quale, perché altrimenti ti leghi a usare LINQ da entrambe le parti. In questo senso pensare a un wrapper di un servizio legacy è un grande aiuto e i vantaggi sono parecchi.
Chiaramente, dovendo sviluppare servizio e client sarebbe comodo avere uno standard già definito per la serializzazione di expression tree generico - e da quanto ne so in questo campo le proposte latitano... ammesso che sia un'area su cui si possa fare una qualche standardizzazione. In realtà lo standard per le query c'è già e si chiama SQL, ma noi cerchiamo sempre di complicarci la vita... :)
29/07/2008 12:43 | Marco RUsso
Gravatar

# re: Architetture multilayer fatte di programmazione funzionale, provider e servizi

Sicuramente non passa l'expression tree tal quale, ma le varie parti potrebbero essere riusabili. Voglio dire che io immagino le Expression.Call mappate sulle chiamate al servizio ma il partitioning potrebbe essere riciclato tal quale oppure, come scrivevo, opportunamente convertito.
Avere partitioning, grouping, etc. complessi passabili come singoli parametri è un sogno che da tanto le software house hanno cercato di risolvere e spesso con scarsi risultati.

Sullo standard concordo che sarebbe bello averlo ma che è difficile che si materializzi.
Quanto a SQL sono invece scettico. La parte standard di questo linguaggio ha dimostrato di essere scarsamente applicabile persino nei database e le estensioni dei produttori sono tutto fuorché standard ;-)
29/07/2008 13:47 | Raffaele Rialdi
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET