Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato...

76
UNIVERSITA’ DEGLI STUDI DI TRIESTE FACOLTA’ DI INGEGNERIA Corso di Laurea Specialistica in Ingegneria Informatica Tesi di Laurea Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF Laureando Relatore Ledion Spaho Chiar.mo Prof. Maurizio Fermeglia Anno Accademico 2009-2010

Transcript of Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato...

Page 1: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

UNIVERSITA’ DEGLI STUDI DI TRIESTE

FACOLTA’ DI INGEGNERIA

Corso di Laurea Specialistica in Ingegneria Informatica

Tesi di Laurea

Progetto e realizzazione di un software in ambiente Web

per l’integrazione di applicazioni basato su WCF

Laureando Relatore

Ledion Spaho Chiar.mo Prof. Maurizio Fermeglia

Anno Accademico 2009-2010

Page 2: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

Si può discutere per cercare di capire se l'informatica sia più arte o scienza, ma è innegabile che nell'informatica il concetto di bellezza esiste a tutti i livelli: dagli algoritmi e strutture dati al codice sorgente, alle interfacce grafiche, ai singoli software stessi quando hanno quell'equilibrio tra funzionalità e intuitività.

Salvatore ‘antirez’ Sanfilippo

Page 3: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

3

Indice

Indice delle figure .................................................................................................................................. 4

Introduzione ............................................................................................................................................ 5

Capitolo 1 - Architetture d’Integrazione ................................................................................................. 7

1.1 Introduzione .................................................................................................................................. 7

1.2 Strategie d’integrazione ................................................................................................................ 9

1.3 SOA e l’integrazione .................................................................................................................... 14

1.4 Conclusioni .................................................................................................................................. 15

Capitolo 2 – Analisi di requisiti .............................................................................................................. 17

2.1 I requisiti ..................................................................................................................................... 17

2.2 I casi d’uso ................................................................................................................................... 18

Capitolo 3 - Progettazione .................................................................................................................... 21

3.1 Database: integrazione e modifiche ........................................................................................... 21

3.2 L’applicazione .............................................................................................................................. 25

3.3 Presentazione.............................................................................................................................. 32

3.4 Scelte progettuali ........................................................................................................................ 33

Capitolo 4 – Realizzazione ..................................................................................................................... 37

4.1 Rich Internet Applications, un primo tentativo .......................................................................... 37

4.2 Persistenza di dati ....................................................................................................................... 40

4.3 Logica funzionale......................................................................................................................... 43

4.4 Interfaccia Utente (UI) ................................................................................................................ 49

Conclusioni ............................................................................................................................................ 68

Appendice 1 - Come aggiungere un’altra funzionalità ......................................................................... 70

Ringraziamenti ...................................................................................................................................... 75

Bibliografia ............................................................................................................................................ 76

Page 4: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

Indice delle figure

Figura 1: PI, EAI e EII ------------------------------------------------------------------------------------------------------- 10

Figura 2: Portal Integration ---------------------------------------------------------------------------------------------- 10

Figura 3: Enterprise Application Integration, P2P e Middleware-based -------------------------------------- 12

Figura 4: Enterprise Information Integration ------------------------------------------------------------------------ 13

Figura 5: Figura 5: PI, EAI, EII e SOI ------------------------------------------------------------------------------------- 15

Figura 6: I casi d'uso del sistema ---------------------------------------------------------------------------------------- 20

Figura 7: Le tabelle in comune dalla fusione dei database ------------------------------------------------------- 21

Figura 8: Lo schema fisico finale del database ---------------------------------------------------------------------- 22

Figura 9: L’architettura tipica di un’ applicazione Web ----------------------------------------------------------- 25

Figura 10: La soluzione tecnica del sistema -------------------------------------------------------------------------- 30

Figura 11: Un’applicazione Web non distribuita -------------------------------------------------------------------- 31

Figura 12: Un’applicazione Web distribuita -------------------------------------------------------------------------- 31

Figura 13: RIA secondo Macromedia ---------------------------------------------------------------------------------- 38

Figura 14: La versione RIA del progetto ------------------------------------------------------------------------------- 39

Figura 15: Domain Services, un pattern scalabile ------------------------------------------------------------------ 46

Figura 16: La sequenza degli eventi durante l'autenticazione con Form ------------------------------------- 48

Figura 17: Lo schema a blocchi dell'operazione di un nuovo ordine------------------------------------------- 49

Figura 18: La struttura di un'applicazione AJAX-enabled --------------------------------------------------------- 58

Figura 19: Home Page ----------------------------------------------------------------------------------------------------- 59

Figura 20: Elenco delle sostanze chimiche con le relative frasi di R/S ----------------------------------------- 60

Figura 21: Un esempio di una pagina con i dettagli concernenti una particolare frase di rischio ------ 60

Figura 22: La pagina del prelievo di un reagente ------------------------------------------------------------------- 61

Figura 23: La pagina della restituzione di un reagente ------------------------------------------------------------ 62

Figura 24: Nuovo ordine, primo passo -------------------------------------------------------------------------------- 63

Figura 25: Nuovo ordine, secondo passo ----------------------------------------------------------------------------- 63

Figura 26: Nuovo ordine, terzo passo --------------------------------------------------------------------------------- 64

Figura 27: Nuovo ordine, quarto passo ------------------------------------------------------------------------------- 65

Figura 28: Nuovo ordine, quinto e l'ultimo passo ------------------------------------------------------------------ 65

Figura 29: Archivio degli ordini ------------------------------------------------------------------------------------------ 66

Figura 30: Lo spazio dedicato all'amministratore del sistema. -------------------------------------------------- 67

Page 5: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

5

Introduzione

a storia dell'informatica insegna che lo sviluppo dei sistemi informativi non

avviene in maniera continua ed organica: molto più spesso l'avvento di nuove

tecnologie e le necessità legate al business producono ciclicamente l'esigenza

di creare nuovo software. Ogni volta che questo accade ci si trova di fronte al problema di

evolvere il sistema evitando però di perdere gli investimenti che sono già stati effettuati (le

applicazioni già presenti). Nell'evoluzione dei sistemi, nasce quindi in maniera naturale la

necessità di effettuare attività di "integrazione".

“Integrare applicazioni software in ambito enterprise” è un'attività all'ordine del

giorno, che presenta in certi casi sfide di notevole complessità. Lo scopo principale di queste

attività è ottenere uno scambio di informazioni tra sistemi informativi eterogenei ed

autonomi, con l'obiettivo di sviluppare le attività aziendali e mantenere certe risorse e

applicazioni già presenti in azienda.

Il motivo della presente tesi sta proprio nell’integrazione di software e componenti

già in uso sviluppati ad - hoc che soddisfano in questo momento la maggior parte delle

necessità e le esigenze del dipartimento universitario DICAMP. Con il passare del tempo la

situazione esistente risultava non solo ingestibile in termini di manutenzione e inefficiente

perché ogni programma dispone il suo database, quindi una ridondanza elevata, ma anche

poco user-friendly giacché l’interfaccia utente e la logica di funzionamento di ogni

applicazione è diversa dalle altre.

Quindi è ritenuto opportuno la necessità di unificare il lavoro svolto dagli altri

studenti, sia la parte che riguarda i dati che quella della logica applicativa e l’interfaccia

utente. L’obiettivo di questa seconda fase è quello di “tradurre” tali applicativi in .NET

ovvero rendergli, se vogliamo, più ‘standard’ e facilmente modificabili, migliorabili e

scalabili, nonché permettere all’applicativo finale di comunicare più facilmente con gli altri

software presenti e futuri. Così facendo si arriva in una soluzione robusta: un progetto di

unificazione. Tale soluzione deve :

ricoprire gli obiettivi del dipartimento

avere un unica fonte di dati

avere un’unica interfaccia utente (rendendo user-friendly)

essere distribuita in maniera tale di agevolare il collaudo e la manutenzione

essere facilmente estendibile

Il risultato finale del lavoro sarà un sistema informativo basato su web che integra tutti i processi di business rilevanti (quale gestione degli ordini, del magazzino, ecc) e le altre necessità informatiche del dipartimento.

L

Page 6: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

E’ stato scelto di sviluppare l’applicativo usando il framework .NET per il semplice motivo che il server web del dipartimento (IIS) non è in grado di eseguire elaborazioni server-side oltre a quelle fornite dalla casa produttrice. Viene precisato inoltre che tutti i moduli software descritti in questo documento sono stati sviluppati dall'autore, ad eccezione del modulo che compie un nuovo ordine, il quale è stato reingegnerizzato parzialmente e riutilizzato.

La tesi contiene i seguenti capitoli:

Capitolo 1 – “Architetture d’Integrazione”, si presenterà una classificazione delle

strategie architetturali che è possibile utilizzare per l'integrazione. Infine vengono

presentati i concetti delle architetture service-oriented (SOA), un paradigma

architetturale più indicato per lo sviluppo di sistemi informativi complessi adattabili a

tutte le problematiche d’integrazione (sia interna che esterna).

Capitolo 2 – “Analisi di requisiti”, lo scopo generale di questo analisi è stabilire ‘che

cosa’ il sistema in questione deve fare fornendo le linee guida sulle funzionalità e le

operazioni che il sistema finale dovrà essere in grado di svolgere.

Capitolo 3 – “Progettazione”, in questa successiva fase vengono riportate le decisioni

sul ‘come’ tali requisiti saranno soddisfatti, entrando nel merito della struttura che

dovrà essere data al sistema software. Infine è stata affrontata la descrizione delle

scelte progettuali, in particolar modo mettendo in risalto le tecnologie software

scelte per l’implementazione del sistema.

Capitolo 4 – “Realizzazione”, corrisponde alla traduzione in uno o più linguaggi di

programmazione delle decisioni prese in sede di progettazione per essere

implementate concretamente attraverso la creazione dei moduli funzionali e la loro

progressiva integrazione. Essendo un’applicazione 3-tier, si è concentrato

principalmente sulla persistenza dei dati (Data Tier), sulla logica funzionale

(Business/Logic Tier) e sull’interfaccia utente (Presentation Tier).

Conclusioni, in questa parte si farà un riassunto per capire se gli obiettivi prefissati

sono stati raggiunti e i requisiti che erano stati individuati sono stati soddisfatti.

Inoltre si elencheranno eventuali sviluppi futuri per migliorare le prestazioni e altri

ambiti desiderati.

Appendice 1 – Come aggiungere un’altra funzionalità, consiste in un mini-manuale

coi passi da seguire nel caso che si vuole estendere il sistema sviluppando un’altro

modulo che svolge una certa funzionalità desiderata.

Page 7: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

7

Capitolo 1 - Architetture d’Integrazione

’azienda dispone di tante applicazioni più o meno obsolete, è ora di

rimodernare, recuperando e riutilizzando ciò che non è conveniente riscrivere

e riscrivendo ciò che va ormai dismesso. Perché dismettere qualcosa che

funziona anche se obsoleto? Forse perché occorre la possibilità di estendere e migliorare il

preesistente, forse perché è necessario offrire i propri servizi sul Web, forse perché

l'integrazione di oggi getta le basi per affrontare le sfide di domani.

Stiamo parlando dell’ Enterprise Integration. Giga Group, in un report di qualche

tempo fa, la definiva "…..la sfida di reperire strumenti e tecnologie tali da offrire la più

semplice transizione possibile verso il web nel breve termine, e al tempo stesso un cammino

di migrazione verso architetture a componenti nel lungo termine". Si tratta in effetti di fare i

conti con un assetto IT in molti casi un tantino superato ma pienamente funzionante in

esercizio, con l'esigenza di affacciarsi sul web per conoscere e farsi conoscere, magari per

offrire anche i propri servizi applicativi, cercando di essere competitivi, di non dilapidare il

proprio budget, di "arrivare" presto sul mercato, di offrire valore aggiunto, di porre le basi

per una ristrutturazione che funzioni oggi ma che resti valida anche per il domani.

Questo è proprio l'argomento del presente capitolo, in cui si cercherà di fare il punto

su queste problematiche, di porsi delle domande e di cercare una chiave di lettura e di

analisi per possibili risposte.

1.1 Introduzione

L'integrazione è un problema assai complesso. Coinvolge aspetti economici,

tecnologici, culturali ed organizzativi. L'aspetto economico è evidenziato dal fatto che

un'organizzazione ha la necessità di evolversi e, allo stesso tempo, conservare i propri asseti

aziendali. Un'organizzazione matura con un sistema informativo complesso sa che il

cambiamento è inevitabile. E’ quindi il suo compito gestirlo in modo da minimizzare

l'impatto economico. L'ambito del Business è in continuo e rapido cambiamento; la

competizione è sempre più accesa. Le regole e gli standard impongono alle aziende una

sempre maggiore reattività.

Oltre queste sollecitazioni "esterne", ci sono quelle interne, che possono essere di

varia natura. Lo stimolo può venire dalla necessità del raggiungimento di obiettivi legati ai

processi aziendali, come ad esempio la “velocizzazione” della produzione o della consegna, il

miglioramento della qualità riducendo gli errori o i colli di bottiglia, l'aumento della

flessibilità dei processi aziendali, la possibilità di implementare nuove soluzioni di business

L

Page 8: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

in modo più veloce ed economico per consentire una sempre più facile modifica dei processi

aziendali.

Infine può essere l'area IT che si trova a dovere affrontare questi problemi: può

nascere la necessità di integrare applicazioni esistenti ed infrastrutture IT corporate (a

seguito ad esempio di fusioni, acquisizioni, out-sourcing, ...) preservando ed ottimizzando

sempre più gli investimenti; in questi interventi si affrontano molte questioni complesse.

Alcuni esempi sono: eliminare la ridondanza di funzioni e/o dati, ridurre la complessità dei

sistemi, riutilizzare le applicazioni esistenti, mantenere il controllo di efficienza e il governo

della struttura integrata per le attuali e future applicazioni aziendali e adottare un approccio

il più possibile modulare per ridurre anche i rischi d’installazione e aggiornamento di nuove

applicazioni.

Si hanno quindi obiettivi, visioni e interessi diversi che si devono riconciliare e che

nascono dal fatto che le aziende necessitano di un continuo adattamento per sopravvivere e

rimanere profittevoli: l'obiettivo è di rispondere sempre più velocemente alle mutevoli

sollecitazioni esterne ed interne.

Le domande comuni che un'organizzazione con obiettivi di questo tipo si pone sono:

Come evolvo il mio sistema informativo in modo da avere un costo il più basso

possibile?

Come devo progettare e sviluppare un sistema oggi in modo che il costo

dell'integrazione sia basso domani?

Come posso raggiungere gli obiettivi di business prefissati nel modo più “economico”

e più flessibile possibile?

Esiste anche un ulteriore raffinamento del problema: con lo sviluppo della rete è

diventato concreto il problema dell'integrazione a livello business, cioè la creazione di

processi B2B1 ottenuti componendo funzionalità che sono esposte da organizzazioni

differenti. Possiamo quindi parlare di integrazione “interna” (normalmente legata ad una

estensione dei sistemi con nuove o vecchie tecnologie) e integrazione “esterna”. Per

rispondere correttamente a queste domande occorre affrontare innanzitutto il problema dal

punto di vista architetturale piuttosto che tecnologico.

1 B2B o Business-to-Business indica le relazioni che un'impresa detiene con i propri fornitori per attività di

approvvigionamento, di pianificazione e monitoraggio della produzione, o di sussidio nelle attività di sviluppo del prodotto, oppure le relazioni che l'impresa detiene con clienti professionali, cioè altre imprese, collocate in punti diversi della filiera produttiva.

Page 9: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

9

1.2 Strategie d’integrazione

Si potrebbe classificare le strategie d’integrazione sulla base del livello architetturale

su cui agiscono. Si suppone di avere un sistema informativo a strati che sia suddivisibile in:

Data layer

Business Layer

Presentation Layer

Le strategie d’integrazione che saranno considerate sono classificabili , in prima istanza,

con il layer su cui vanno ad agire. Si può quindi pensare di integrare a livello di

presentazione, a livello di logica applicativa oppure a livello di dati. La scelta del livello su cui

si effettua integrazione è dettata da molti fattori.

La prima classificazione sulle strategie di integrazione è:

1. Portal Integration (PI)

2. Enterprise Information Integration (EII)

3. Enterprise Application Integration (EAI)

Questi tre possibili approcci architetturali sono volti ad aggiungere alle tradizionali

applicazioni "verticali", caratterizzate da scarsa integrazione reciproca e dalla presenza di

information silos2 isolati, una dimensione di integrazione orizzontale che è in grado di

portare ad ulteriori vantaggi di business mediante una maggiore efficienza generale dei

processi aziendali ed inter-aziendali. In seguito saranno spiegate brevemente queste

strategie evidenziando per ognuno i pregi e i difetti.

2 I silos di informazioni sono la metafora per rappresentare il modo con il quale vengono raccolte e accumulate

le informazioni contenute in specifiche basi di dati tra loro incompatibili. Costituiscono una delle principali limitazioni alla possibilità di accedere in maniera trasversale alle informazioni di singoli oggetti o soggetti archiviate sotto profili differenti in silos differenti. (fonte: www.ilsole24ore.com)

Page 10: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

Figura 1: PI, EAI e EII

1.2.1 Portal Integration

La Portal Integration avviene a livello d’interfaccia utente. Questo tipo di strategia è

molto comune dato che è semplice da implementare, non è invasivo nei confronti delle

applicazioni integrate e permette di effettuare in maniera semplice e rapida l'aggregazione

di sistemi molto eterogenei tra loro.

Quello che viene realizzato è un “accorpamento” di diverse applicazioni su

un'interfaccia comune. Un componente aggrega le diverse applicazioni che sono

responsabili di esporre la propria interfaccia in un modo che sia componibile dal portale. Il

portale mostra quindi un'interfaccia composta da tutte le applicazioni che integra.

Al contrario dell’integrazione a

livello di business logic (che aggrega

elaborazione di sistemi diversi), nel caso di

integrazione a livello di portale le

informazioni provenienti da sorgenti

multiple e differenti vengono visualizzate

in una singola finestra. Questo avviene

normalmente dividendo lo schermo in

diverse zone ognuna delle quali comunica

con un differente sistema.

Figura 2: Portal Integration

Page 11: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

11

I processi di business sono di fatto eseguiti dagli utenti del portale, che effettuano le

interazioni sulla base dei dati esposti. Il portale diventa di fatto il punto centrale di accesso

per insieme eterogeneo di applicazioni. Nel caso di applicazioni web (che è il più frequente)

questo si realizza tecnologicamente ad esempio tramite normali tecniche HTML (frame,

collegamento ipertestuale, tab view o window open), oppure utilizzando componenti più

raffinati (giusto per fornire qualche esempio: WebParts nell’ambito .NET, largamente usato

dal Sharepoint; oppure Portlet in quello J2EE).

In conclusione questo tipo d’integrazione è interessante nel momento in cui si

richieda una soluzione veloce e non invasiva (e, di conseguenza, poco costosa). In alcune

situazioni questo è sufficiente e può essere una strategia vincente. In altri casi è necessario

effettuare azioni più complesse, agendo sulla business logic o sull'accesso ai dati.

1.2.2 Enterprise Application Integration

In questo caso ci si focalizza sull'integrazione della logica applicativa. Lo scopo è la

condivisione della logica di business tra applicazioni diverse o la composizione di moduli di

logica già sviluppati in processi nuovi. Al contrario della PI, dove sia i dati che la logica

possono vivere indipendentemente, in questo caso parte della logica di business è

necessariamente condivisa.

Si può classificare l'integrazione EAI secondo due possibili approcci:

1. Verticale (P2P – Point-to-Point)

2. Centralizzata (Middleware-based)

In un'integrazione Punto-Punto (Spaghetti3 Integration) si costruiscono le singole

connessioni tra le Applicazioni gestendo singolarmente i problemi di comunicazione e di

mappatura dei dati. Il vantaggio principale dell’approccio P2P è che in questo modo si crea

una connessione “stretta” e sincrona tra le due applicazioni, con la possibilità di integrare

all'interno del codice (in modo mirato) non solo le necessarie conversioni dei dati, ma anche

le regole di business.

Lo svantaggio principale è che tale codice può essere complesso da sviluppare e va

generato per ogni coppia di applicazioni. All’aumentare delle applicazioni da integrare

crescono anche le connessioni da implementare e l’accoppiamento tra di esse con evidenti

impatti sui costi di manutenzione.

3 ‘Spaghetti’ è un termine dispregiativo per quei programmi per computer che abbiano una struttura di

controllo del flusso complessa e/o incomprensibile con construtti di ramificazione non strutturati. Il suo nome deriva dal fatto che i diagrammi di flusso di questi tipi di codice tendono a assomigliare a dei piatti di spaghetti, ovvero a una catasta di fili intrecciati e annodati. In generale Spaghetti = casino

Page 12: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

L'integrazione di N applicazioni con altre M con un approccio P2P implica la creazione di

N X M connessioni separate. A tendere, un'architettura di questo tipo, degenera in un

groviglio esponenziale di collegamenti e comporta complessità e costi di manutenzione ed

evoluzione crescenti (spaghetti integration).

Figura 3: Enterprise Application Integration, P2P e Middleware-based

Sarebbe difficile che le soluzioni P2P realizzate saranno in qualche misura riusabili o

adattabili. Con la crescita delle applicazioni aziendali e la necessità di connettere molteplici

applicazioni nello sviluppo di applicazioni Web, nel campo degli strumenti per l'integrazione

era necessario un salto in termini di funzionalità e velocità: è per questo che, rispetto ad

approcci "tattici" ad - hoc per le specifiche necessità punto-punto, sono nate le piattaforme

EAI (Enterprise Application Integration) contraddistinte dalla presenza di un Middleware4

d'integrazione che consenta un'integrazione centralizzata, disciplinata e maggiormente

standardizzata.

Per evitare i problemi sopra descritti, è opportuno definire ed integrare

nell’architettura un opportuno strato di Application Integration che permetta di isolare le

applicazioni centralizzando la gestione delle interconnessioni. L’adozione di tecnologie più

sofisticate quali sistemi di Messaging, Gateway e Middleware di comunicazione consentono

di semplificare le problematiche di comunicazione e supportano meccanismi sincroni e real-

time. Tale approccio può essere a sua volta “diretto” o “indiretto”.

L’approccio più diretto prevede di utilizzare una semplice tecnologia di connessione

e comunicazione, demandando allo strato applicativo (possibilmente ingegnerizzato), le

ulteriori problematiche d’integrazione (mapping, routing, transformation, …). L’approccio

“meno diretto”, Middleware-based, prevede l’introduzione di uno strato di Middleware più

o meno evoluto. Tale strato, agendo da intermediario, centralizza sia le problematiche

puntuali di comunicazione che quelle più ampie d’integrazione.

4 Il termine Middleware genera spesso confusione. Letteralmente è lo strato software "posto nel mezzo"; si

intende un insieme di programmi informatici che fungono da intermediari tra diverse applicazioni e componenti software. Sono spesso utilizzati come supporto per sistemi distribuiti complessi. Comunemente i Middleware sono suddivisi in tre macro-aree: Basic Middleware, Platform Middleware e Integration Middleware.

Page 13: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

13

1.2.3 Enterprise Information Integration

Relativamente nuovo, almeno rispetto ai due precedenti, quest’approccio è

incentrato sull'integrazione a livello dati. Si basa sul concetto che in alcune organizzazioni il

problema non è legato tanto alla condivisione della logica quanto ad avere una modalità di

accesso ai dati centralizzata, omogenea e condivisa. In questo caso si ritiene che

l'integrazione a livello di logica applicativa non sia necessaria: l'obiettivo è avere applicazioni

che agiscono sugli stessi dati, che devono essere quindi accessibili in maniera omogenea.

Questo si realizza mediante

l'uso di una serie di tecnologie tra le

quali la più peculiare è quella della

database federation, che

implementa un concetto di

"database virtuale".

Figura 4: Enterprise Information Integration

L'EII ha l'obiettivo di raggiungere un’integrazione a livello dati che complementi gli

altri approcci al problema generale dell'integrazione, e sia in grado di assicurare:

una vista completa, tempestiva ed univoca (!) su entità ed eventi critici a livello

aziendale

connettività, accessibilità e utilizzabilità dei dati a prescindere da specifiche

piattaforme, database, formati (inclusi i dati non strutturati)

consistenza a livello enterprise dei dati che sono a fondamento di applicazioni

diverse tra loro correlate (ad esempio a fronte di replicazione).

L'EII si rende concreto nella realizzazione di uno strato di Middleware che da un lato

sia accessibile a ogni tipo d’applicazione e strumento mediante interfacce standard, e

dall'altro sia in grado di accedere e agire su ogni tipo di dato e informazione, qualunque sia

la natura, la forma (strutturata, semi-strutturata, non strutturata), la locazione fisica,

fornendo sui dati stessi una serie di servizi che, superando il tradizionale acceso "a silos

applicativi", ne consentono un utilizzo ottimale da parte di ogni utente e ogni processo

aziendale.

Page 14: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

1.3 SOA e l’integrazione

Dall'esperienza degli architetti sulle problematiche di sviluppo e integrazione è nata

la definizione di una serie di best-practices che globalmente sono indicate con il termine

Service-Oriented Architecture (SOA).

SOA5 è un nuovo paradigma architetturale basato sui concetti di servizio e di

processo. Un servizio è una funzionalità (con un preciso significato di business) che deve

essere disegnato seguendo una serie di dettami architetturali. La caratteristica

fondamentale di quest’approccio è un forte pragmatismo, orientato soprattutto alla

produzione di sistemi informativi complessi che siano nel frattempo facilmente mantenibili,

estendibili e integrabili.

In generale SOA, come paradigma architetturale, proponendosi come obiettivo

esplicito il disegno per l'integrazione, può essere pensato come ortogonale rispetto alle

specifiche istanze di strategie architetturali considerate. Questo significa che, sia che si

considerino sistemi in cui viene effettuata integrazione a livello di portale, di logica di

business o di dati, è possibile (ma sopratutto consigliato) adottare un’architettura a servizi.

Ad esempio, nel caso di PI possiamo comporre "viste" di servizi; nel caso di EAI, i servizi sono

composti o orchestrati in altri servizi e infine in caso di EII, i servizi possono esporre logiche

di accesso ai dati che mascherano la vera complessità dei sistemi sottostanti.

Il presupposto che guida SOA è la considerazione che conviene sviluppare sistemi già

pensando all'integrazione (il cambiamento è inevitabile!) piuttosto che adattarli volta per

volta.

Molti dei principi di SOA si sposano alla perfezione con le problematiche

d’integrazione. In effetti, questi dettami discendono direttamente dalla consapevolezza che,

se il sistema che si sviluppa ha successo, in futuro occorrerà integrarlo. Oppure dal fatto che

si ritiene necessario conservare gli asseti dell'organizzazione, in questo caso facendo

esplicitamente integrazione.

L'applicazione dei principi di SOA alle problematiche d’integrazione viene indicato

con il termine Service Oriented Integration (SOI), che prevede lo sviluppo di Integration

Services. Un Integration Service ha lo scopo di fornire un’interfaccia a servizi di applicazioni

esistenti portando a fattore comune funzionalità o dati trasversali alle applicazioni.

5 Anche se esistono molteplici definizioni di SOA, solo il gruppo OASIS (Organizzazione per lo sviluppo di

standard sull'informazione strutturata) ha prodotto una definizione formale applicabile profondamente sia alla tecnologia che ai domini aziendali: “Un paradigma per l'organizzazione e l'utilizzazione delle risorse distribuite che possono essere sotto il controllo di domini di proprietà differenti. Fornisce un mezzo uniforme per offrire, scoprire, interagire ed usare le capacità di produrre gli effetti voluti consistentemente con presupposti e aspettative misurabili.”

Page 15: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

15

Per quanto riguarda EAI e SOA, si

può dire che nell'evoluzione generale dei

sistemi IT verso la Service Oriented

Architecture le funzionalità da integrare

devono essere esposte tramite una logica

a servizi. Tali servizi, detti Functional

Integration Service, possono permettere

l'accesso e l'utilizzo di funzionalità di

business da parte di qualunque altro

servizio, applicazione o utente finale.

Per quanto riguarda invece EII e

SOA, trova posto anche l'emergere dell'EII

nel ruolo chiave di fornitore di Data

Integration Service (o Information Service)

a livello enterprise; in questo caso questi

servizi sono resi disponibili alle altre

applicazioni mediante l'elemento portante

della SOA stessa costituito dall'Enterprise

Service Bus.

Figura 5: Figura 5: PI, EAI, EII e SOI

1.4 Conclusioni

In questo capitolo sono state introdotte le principali strategie architetturali adottate

sino a oggi nell’ambito IT per l'integrazione nei sistemi informativi complessi: Portal

Integration (PI), Enterprise Application Integration (EAI) ed Enterprise Information

Integration (EII). Queste strategie differiscono tra loro in base al layer architetturale su cui si

effettua integrazione. La PI effettua un accorpamento di diverse applicazioni in un'unica

interfaccia utente, l'EAI prevede l’integrazione a livello di business-logic mentre l'EII propone

un approccio orientato ai dati.

E' importante notare che i tre approcci brevemente descritti in precedenza non sono

in assoluta alternativa ma piuttosto complementari: l'EII può ad esempio essere

vantaggiosamente posta al servizio di soluzioni di portale e di workflow fornendo ad esse un

accesso unificato a diverse sorgenti dati, con una tangibile semplificazione nella costruzione

delle soluzioni stesse. L'Enterprise Application Integration si focalizza sull'integrazione della

logica applicativa. Lo scopo è la condivisione della logica di business tra applicazioni diverse

o la composizione di "pezzi" di logica già sviluppati in processi nuovi. Al contrario della PI,

dove l'integrazione è a livello di portale e dove sia i dati che la logica possono vivere

indipendentemente, in questo caso parte della logica di business è necessariamente

condivisa.

Page 16: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

Si è inoltre presentato SOA / SOI come la soluzione architetturale più adattabile al

cambiamento, introducendo concetti che si dimostrano essere ortogonali e trasversali alle

strategie d’integrazione presentate. In conclusione, abbiamo osservato che SOA è

compatibile con tutte le strategie architetturali considerate (PI, EAI, EII): questo ne

conferma ulteriormente la validità nello sviluppo di applicazioni complesse orientate

all'integrazione.

Page 17: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

17

Capitolo 2 – Analisi di requisiti

i espone in questo capitolo la fase iniziale del ciclo di vita del software, ossia

l’analisi. Questo momento, contrariamente a quanto si potrebbe pensare,

risulta essere il più importante dell’intera fase di produzione dell’applicativo. Si

è erroneamente portati a credere infatti, che sia la fase di codifica il punto critico, ma basti

pensare che un errore di valutazione al momento dell’analisi si ripercuoterà su tutte le fasi

successive (benché queste siano svolte correttamente), quindi sull’intero progetto. È quindi

l’errore in fase di definizione dei requisiti il più grave che si possa commettere, in quanto

esso potrà essere rilevato solo al momento del collaudo dell’applicativo con immaginabili

conseguenze negative, soprattutto in progetti di grandi dimensioni. Ecco perché nei casi di

produzioni importanti si è soliti utilizzare modelli di sviluppo misti, magari con l’aggiunta del

ciclo di ‘prototipizzazione’, al fine di evitare in modo assoluto grossolani errori in questo

primo avanzamento della produzione. Nel nostro caso, vista la limitatezza del lavoro, si è

ritenuto sufficiente adottare un modello di sviluppo standard a cascata.

Va detto che non è stato necessario eseguire tutte le fasi del modello da zero.

Essendo questo un lavoro d’integrazione che si fonda su una progettazione già collaudata,

alcune fasi, come la raccolta dei requisiti mediante intervista e la realizzazione della base di

dati non sono state affrontate e si è utilizzato la documentazione disponibile e analizzando il

materiale già presente, raccolto in precedenza, per finire con la stesura del documento dei

requisiti.

2.1 I requisiti

I requisiti forniscono le linee guida sulle funzionalità e le operazioni che il sistema

finale dovrà essere in grado di svolgere. Si ottengono in vari modi, come interviste dirette

agli utenti e committenti, oppure utilizzando materiali quali documentazioni raccolte in

momenti precedenti. Nel nostro caso si seguirà la seconda modalità.

In modo grossolano, le applicazioni da unificare6 sono 3, ed eventualmente ne saranno

aggiunte altre quando sarà necessario :

6 Per ulteriori dettagli degli applicativi esistenti si consiglia di consultare le tesi dei miei colleghi :

Samo Ziberna, Progetto e sviluppo di un’applicazione per la gestione di un reagentario

Daniele De Gan, Sviluppo di un’applicativo in .NET per la gestione degli ordini ai fornitori di un dipartimento universitario.

S

Page 18: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

I. Frasi di rischio e di sicurezza:

Le frasi di rischio e sicurezza sono delle frasi standard, contraddistinte da un codice e

una frase in linguaggio naturale, che descrivono rispettivamente i rischi per la salute

umana, animale o ambientale che una sostanza chimica può provocare e i consigli di

prudenza nel manipolare tale sostanza chimica. Le frasi sono codificate dalla direttiva

europea 88/379/CEE (e successive modifiche) e attualmente vige l'obbligo di

specificarle sulle etichette delle sostanze chimiche..

II. Reagentario:

Il reagentario è il magazzino delle sostanze chimiche del dipartimento di ingegneria

chimica dell'università degli Studi di Trieste. Le sostanza chimiche in possesso del

dipartimento vengono conservate principalmente in una stanza centrale chiamata

“magazzino reagentario”. Alcune sostanze che necessitano di particolari condizioni di

stoccaggio, ad esempio temperatura costante, vengono stoccate in più frigoriferi

localizzati all'interno dei laboratori.

III. Gestione Ordini:

Gestire la memorizzazione degli ordini ai fornitori e permette agli utenti di

compilare, in modo più semplice e rapido, il documento necessario alla richiesta delle

merci o dei servizi. Il documento da elaborare consisterà in un riepilogo dei dati

dell’ordine, in particolar modo l’intestazione del fornitore, l’elenco dei prodotti da

ordinare e altri dati come ad esempio le date di ordine e offerta ecc.

Il dipartimento è già in possesso di tutto il hardware necessario per soddisfare gli

obbiettivi preposti, mentre le applicazioni, seppure coprendo le funzionalità richieste, non

soddisfano gli obbiettivi di semplicità d'utilizzo espressi dagli utenti.

Si rende così necessaria la progettazione e lo sviluppo di una nuova applicazione, la

quale dovrà raggruppare le funzionalità già esistenti in un unica interfaccia utente, avendo

come obiettivo primario la semplicità d'utilizzo ed estendibilità.

2.2 I casi d’uso

In seguito saranno elencati i casi d’uso principali.

Consultazione frasi Rischio/Sicurezza:

Questa parte del sistema sostituirà il catalogo cartaceo delle frasi di rischio e

sicurezza, il quale deve, per obbligo di legge, essere accessibile a chiunque all'interno

dei laboratori.

Il sistema deve quindi garantire l'accesso a queste informazioni a chiunque e nel

modo più intuitivo e semplice possibile. L'utilizzatore del sistema, infatti, deve poter

trovare le frasi di rischio e sicurezza della sostanza chimica desiderata nel minor

Page 19: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

19

tempo possibile, poiché si potrebbe trovare in una situazione di pericolosità, nella

quale queste informazioni possono scongiurare un ulteriore danno.

Inoltre in questa sezione deve essere previsto un meccanismo di scelta della lingua

(italiano o inglese) sia per le frasi di rischio e sicurezza sia per la parte di interfaccia.

Prestito e Restituzione:

Questa parte del sistema deve essere accessibile solamente agli operatori di

laboratorio autorizzati. Ogni operatore può effettuare un prestito/prelievo di una o

più sostanze chimiche, dette reagenti, scegliendo, in base alla sostanza chimica, il

contenitore specifico e inserendo la quantità prelevata e il luogo nel quale il

contenitore verrà riposto. Il sistema deve inoltre tenere traccia dell'utente che ha

effettuato l'operazione e la data nella quale l'operazione è stata svolta.

Gestione Ordini

Questa parte del sistema deve essere accessibile solamente ai dipendenti del

dipartimento autorizzati ad effettuare degli ordini. Lo scopo principale di questo

modulo è l’inserimento degli ordini di un dipartimento universitario, al fine di

produrre un documento d’ordine da poter inviare alla ditta fornitrice della merce o

dei servizi. Oltre a compiere un ordine, l’operatore autorizzato può vedere anche

l’archivio completo degli ordini passati.

I casi d’uso successivi vengono svolti solo dall’/dagli amministratore/i del sistema.

Gestione Frasi Rischio/Sicurezza:

La parte di Gestione Frasi R/S deve essere raggiungibile solamente da un tipo

di utente specifico, ovvero dall'amministratore. L'amministratore deve poter inserire

le frasi di rischio/sicurezza, aggiornarle e eventualmente eliminarle.

Gestione Reagente:

L'amministratore deve poter inserire un nuovo contenitore di reagente,

specificando di quale sostanza chimica si tratta, la capacità del contenitore, la data

d'acquisto, l'eventuale data di scadenza, il fornitore che l'ha fornita, il luogo in cui è o

sarà riposta e l'operatore di laboratorio che l'ha richiesta.

In questa sezione l'amministratore deve poter modificare i dati del reagente ed

eventualmente eliminare il contenitore, il ché comporta l'inserimento in automatico

della data di eliminazione e il cambio di stato in “Eliminato”.

Inoltre deve poter visualizzare l'elenco dei reagenti, filtrati in base alla sostanza

chimica.

Gestione Sostanza Chimica:

In questa parte l'amministratore deve poter inserire una nuova sostanza

chimica, il ché comporta l'inserimento di un nome, del numero CAS, della sua

formula chimica, della massa molecolare, della classe di appartenenza. Deve poter

inserire eventuali sinonimi dei nomi, le frasi di rischio e sicurezza associate alla

Page 20: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

sostanza chimica in questione. Inoltre non deve mancare la possibilità di modificare i

dati inseriti ed eventualmente eliminarli.

Gestione Utenti/Fornitori:

Questa sezione permetterà ad effettuare le operazioni di inserimento,

modifica o cancellazione dalla base di dati del sistema le persone che possono

interagire con il sistema stesso. In particolare, anche se il sistema dispone una fase di

registrazione per gli utenti, è necessario che l’amministratore del sistema li

attribuisce i ruoli specificati.

Gestione scarti:

Un’ operazione poco usata fin ora, che però risulta necessaria. Essa elenca gli

scarti smaltiti e quelli da smaltire.

Figura 6: I casi d'uso del sistema

Page 21: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

21

Capitolo 3 - Progettazione

n questa successiva fase vengono riportate le decisioni sul ‘come’ tali requisiti

analizzati nel capitolo precedente saranno soddisfatti, entrando nel merito della

struttura che dovrà essere data al sistema software che deve essere realizzato. In

particolare vengono trattate l’integrazione e le modifiche sulla base di dati, viene illustrato

l’architettura del sistema (evidenziando alcuni considerazioni nell'utilizzo dei livelli e

fornendo linee guida per le prestazioni, la sicurezza e la distribuzione) ed il livello di

presentazione. Infine è stata affrontata la descrizione delle scelte progettuali, in particolar

modo mettendo in risalto le tecnologie software scelte per l’implementazione del sistema.

3.1 Database: integrazione e modifiche

Come già anticipato, si è partiti nella realizzazione dell’applicativo da database

preesistenti. Essendo le applicazioni sviluppate distintamente, ognuna ha il proprio DB.

Il database Reagentario è stato realizzato per la gestione dei reagenti (sostanze

chimiche) presenti all'interno del dipartimento; l'obbiettivo primario era la

tracciabilità dei prelievi/prestiti dei reagenti. Inoltre vengono salvati i dati riguardanti

le frasi di rischio e sicurezza che sono associate alle sostanze chimiche.

Il database GestioneOrdini permette di memorizzazione degli ordini effettuati ai

fornitori.

In questo sottocapitolo seguirà una breve descrizione della struttura del database finale

e in particolar modo si evidenzieranno le modifiche apportate alle tabelle dello stesso, per

poter implementare alcune funzionalità utili.

Confrontando i due diagrammi E-R esistenti si identificavano come possibili punti

d'incontro dei due database le entità Utente e Fornitore. Dalla fusione dei due database

(Reagentario e GESTIONEORDINI) sono cambiati i campi di queste due tabelle :

Figura 7: Le tabelle in comune dalla fusione dei database

I

Page 22: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

Lo schema del database finale è basato sugli schemi dei database esistenti.

Figura 8: Lo schema fisico finale del database

I cambiamenti strutturali apportati sono:

È stata cancellata la tabella tblAbilitazione, perché limita i ruoli di un utente (utente

- ruolo 1:1); invece sono state create le tabelle tblUtenteRuolo e tblRuolo così

facendo si avrà: (utente - ruolo 1:N)

È stata cancellata la tabella tblStatoUtente perché non serve con il nuovo sistema di

autenticazione/autorizzazione. Nel caso che vogliamo attivare un utente registrato,

basta associarlo i ruoli appropriati, nel caso contrario (sospensione) basta toglierlo

tutti i ruoli

la tabella tblLaboratorio è stata sostituita dalla tblLocazioneUtente con i rispettivi

campi: IDLocazioneUtente, NomeLocazione e NomeStanza

visReagentiInUso

SELECT dbo.tblReagenteDF.IDreagente, dbo.tblSostanzaChimica.NomeSostanza, dbo.tblReagenteDV.QuantitàResidua, dbo.tblReagenteDF.Capacità, dbo.tblUnitàDiMisura.Misura, dbo.tblLocazione.NomeLocazione, dbo.tblReagenteDF.DataAcquisto, dbo.tblReagenteDF.DataScadenza, dbo.tblUtente.CognomeUtente, dbo.tblUnitàDiMisura.IDMisura, dbo.tblSostanzaChimica.IDSostanzaChimica, dbo.tblStato.Stato,

Page 23: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

23

dbo.tblLocazione.IDLocazione FROM dbo.tblLocazione INNER JOIN dbo.tblReagenteDV ON dbo.tblLocazione.IDLocazione = dbo.tblReagenteDV.IDLocazione INNER JOIN dbo.tblStato ON dbo.tblReagenteDV.IDStato = dbo.tblStato.IDStato RIGHT OUTER JOIN dbo.tblReagenteDF INNER JOIN dbo.tblSostanzaChimica ON dbo.tblReagenteDF.IDSostanzaChimica = dbo.tblSostanzaChimica.IDSostanzaChimica INNER JOIN dbo.tblUnitàDiMisura ON dbo.tblReagenteDF.IDMisura = dbo.tblUnitàDiMisura.IDMisura INNER JOIN dbo.tblUtente ON dbo.tblReagenteDF.Username = dbo.tblUtente.Username ON dbo.tblReagenteDV.IDReagente = dbo.tblReagenteDF.IDreagente WHERE (dbo.tblStato.Stato = 'Attivo') AND (dbo.tblReagenteDV.QuantitàResidua > 0) OR (dbo.tblStato.Stato = N'In Prestito') AND (dbo.tblReagenteDV.QuantitàResidua > 0)

visReagenteInPrestito

SELECT dbo.tblPrelievo.IDPrelievo, dbo.tblPrelievo.DataPrelievo, dbo.tblSostanzaChimica.NomeSostanza, dbo.tblPrelievo.Username, dbo.tblPrelievo.QuantitàPrelevata, dbo.tblUnitàDiMisura.Misura FROM dbo.tblPrelievo INNER JOIN dbo.tblReagenteDV ON dbo.tblPrelievo.IDReagente = dbo.tblReagenteDV.IDReagente INNER JOIN dbo.tblReagenteDF ON dbo.tblReagenteDV.IDReagente = dbo.tblReagenteDF.IDreagente INNER JOIN dbo.tblSostanzaChimica ON dbo.tblReagenteDF.IDSostanzaChimica = dbo.tblSostanzaChimica.IDSostanzaChimica INNER JOIN dbo.tblUnitàDiMisura ON dbo.tblReagenteDF.IDMisura = dbo.tblUnitàDiMisura.IDMisura WHERE (dbo.tblPrelievo.DataRestituzione IS NULL)

Come esempio sono riportate le seguenti Stored Procedures che verranno maggiormente

utilizzate:

spPrestito : Procedura da chiamare per effettuare un prestito di un reagente.

La procedura inserisce una nuova riga nella tabella Prelievo, utilizzando i dati forniti

come parametri (IDReagente, Quantità, Username, IDLocazione), mentre per la data del

prelievo viene usata la data corrente fornita dal DBMS. Viene inoltre aggiornato lo stato del

reagente, passando a 'In prestito' e la quantità residua viene diminuita della quantità

specificata.

PROCEDURE [dbo].[spPrestito] @IDReagente as int,@Quantita as float,

@Username as nvarchar(16), @IDLocazione as int

AS

BEGIN

SET NOCOUNT ON;

Page 24: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

BEGIN TRANSACTION

INSERT INTO visPrelievo

(IDReagente,DataPrelievo,QuantitàPrelevata,Username) values

(@IDReagente,getDate(),@Quantita,@Username)

IF @@ERROR <> 0

BEGIN

ROLLBACK TRANSACTION

return 10

END

UPDATE visReagenteDV SET QuantitàResidua = QuantitàResidua-

@Quantita, IDStato = (SELECT IDStato FROM visStato WHERE Stato = 'In

prestito'), IDLocazione = @IDLocazione WHERE IDReagente = @IDReagente;

IF @@ERROR <> 0

BEGIN

ROLLBACK TRANSACTION

return 10

END

COMMIT TRANSACTION

END

spRestituzione : Procedura da chiamare per restituire un reagente.

La procedura aggiorna la riga della tabella Prelievo, inserendo la data corrente

fornita dal DBMS come data di restituzione. Inoltre aggiorna la tabella del reagente,

cambiandone lo stato in 'Attivo' e aggiornandone la locazione.

PROCEDURE [dbo].[spRestituzione] @IDPrelievo as int, @IDLocazione as int

AS

BEGIN

SET NOCOUNT ON;

BEGIN TRANSACTION

UPDATE visPrelievo SET DataRestituzione = getDate() WHERE

IDPrelievo = @IDPrelievo

IF @@ERROR <> 0

BEGIN

ROLLBACK TRANSACTION

return 10

END

UPDATE visReagenteDV SET IDStato = (SELECT IDStato FROM

visStato WHERE Stato = 'Attivo'), IDLocazione = @IDLocazione WHERE

IDReagente = (SELECT IDReagente FROM visPrelievo WHERE IDPrelievo =

@IDPrelievo);

IF @@ERROR <> 0

BEGIN

ROLLBACK TRANSACTION

return 10

END

COMMIT TRANSACTION

END

Page 25: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

25

3.2 L’applicazione

Essendo partiti da applicazioni desktop-based, è di buona norma spiegare le scelte progettuali della migrazione verso la piattaforma web 3(N)-tier. Analizzando i problemi comuni, si potrebbero evitare gli errori fatti frequentemente.

Il nucleo di un'applicazione Web è la sua logica sul lato server. Il livello di applicazione Web stesso può essere composto di molti strati distinti. L'esempio tipico è un’ architettura a tre strati composta di presentazione, business, e lo strato dei dati. Nei giorni d’oggi è aumentata anche l’importanza assai notevole dei servizi che può essere considerato come un ulteriore strato. La figura accanto illustra un comune architettura di un’applicazione Web con componenti comuni raggruppati in diverse aree di coinvolgimento.

Figura 9: L’architettura tipica di un’ applicazione Web

3.2.1 Considerazioni sulla progettazione

Durante la progettazione di un'applicazione Web, gli obiettivi di un architetto del software sono di ridurre al minimo le complessità di separazione tra le funzioni in diverse aree di interesse, mentre si progetta un applicazione sicuro e di alta prestazione.

In questa fase valgono i seguenti orientamenti:

• Partizionare l'applicazione logicamente.

Usare stratificazione per partizionare l'applicazione logicamente in livelli di presentazione, business, e accesso ai dati. Ciò consente di creare codice mantenibile e consente di monitorare, testare e ottimizzare le prestazioni di ogni strato separatamente. Un chiaro separazione logica offre anche una maggiore scelta per la scalabilità dell'applicazione.

• Utilizzare astrazione per implementare disaccoppiamento fra gli strati.

Page 26: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

Questo può essere realizzato mediante la definizione dei componenti dell'interfaccia, come ad esempio una facciata con note ingressi e uscite che traduce le richieste in un formato comprensibile per i componenti all'interno del livello. In aggiunta, è anche possibile utilizzare i tipi di interfaccia o le classi di base astratta per definire una astrazione condivisa che devono essere attuate dai componenti di interfaccia.

• Capire come i componenti comunicano tra loro.

Ciò richiede una comprensione degli scenari di distribuzione che l'applicazione deve supportare. È necessario determinare se la comunicazione va oltre i confini fisici o limiti di processi che devono essere supportati, o se tutti i componenti si svolgeranno all'interno dello stesso processo.

• Ridurre il round trip.

Durante la progettazione di un'applicazione Web, è possibile utilizzare tecniche come memorizzazione nella cache e il buffer di uscita per ridurre i viaggi 'andata e ritorno' tra il browser e il server web.

• Considerare l'uso e la strumentazione di registrazione.

E’ buona prassi di tenere traccia di log di attività in tutti i strati e livelli dell‘ applicazione. Questi log possono essere utilizzati per rilevare le attività sospette, che forniscono spesso le prime indicazioni di un attacco al sistema.

• Evitare il blocco durante i compiti funzionali di lunga durata.

Se si dispongono blocchi di operazioni di lunga durata, si considera l'utilizzo di un approccio asincrono per consentire al server Web di elaborare altre richieste in arrivo.

• Considerare l'autenticazione degli utenti attraverso i confini di fiducia.

Si consiglia di progettare l’applicazione per autenticare gli utenti ogni volta che attraversa una frontiera di fiducia, per esempio, quando l'accesso a uno strato a distanza di business dal livello di presentazione.

• Non far passare i dati sensibili in chiaro attraverso la rete.

Quando è necessario passare dati sensibili come password o cookie di autenticazione attraverso la rete, si prende in considerazione la cifratura, firmare i dati o utilizzando SSL.

• Modellare per eseguire l'applicazione Web utilizzando un account con privilegi minimi.

Se un pirata informatico riesce assumere il controllo di un processo, l'identità del processo avrebbe dovuto limitare l'accesso al file del sistema e altre risorse di sistema, al fine di limitare i possibili danni.

Page 27: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

27

3.2. 2 Il panorama di un’applicazione web

Ci sono diversi problemi comuni che sono necessari considerare come sviluppare il disegno. Questi problemi possono essere suddivisi in aree specifiche del progetto. La seguente lista elenca i comuni temi per ciascuna categoria in cui gli errori fatti sono più frequenti:

Autenticazione:

Progettazione di una strategia di autenticazione efficace è importante per la sicurezza e l'affidabilità dell'applicazione. Un’ autenticazione improprio o debole può lasciare l'applicazione vulnerabile agli attacchi di spoofing o di vocabolario, dirottamento di sessione, e altri tipi di attacco.

Autorizzazione:

L'autorizzazione stabilisce i compiti che un’identità autenticata può eseguire e identifica le risorse a cui può accedere. Progettazione di una strategia efficace di autorizzazione è importante per la sicurezza e l'affidabilità dell'applicazione. Un’autorizzazione impropria o debole porta a divulgazione di informazioni, l'alterazione dei dati, e l'elevazione di privilegi. La difesa in profondità è la chiave principiale di sicurezza da applicare alla strategia di autorizzazione.

Caching:

La memorizzazione nella cache migliora le prestazioni e i tempi di risposta dell'applicazione. Tuttavia, le scelte non corrette di caching e design caching poveri possono degradare le prestazioni e la reattività. Si dovrebbe utilizzare la cache di riferimento per ottimizzare le ricerche dei dati, evitare viaggi di andata e ritorno di rete, ed evitare trasformazione inutili e duplicati. Per implementare la memorizzazione nella cache, è necessario decidere quando si devono caricare i dati nella cache. Si deve caricare la cache in modo asincrono o utilizzando un processo batch per evitare eventuali ritardi.

Gestione delle eccezioni:

La progettazione di una strategia efficace di gestione delle eccezioni è importante per la sicurezza e l'affidabilità dell'applicazione. La corretta gestione delle eccezioni nelle pagine Web impedisce dettagli sensibili di eccezione di essere rivelato per l'utente, migliora la robustezza di applicazione, e aiuta ad evitare di lasciare l'applicazione in uno stato incoerente, in caso di un errore.

Navigazione:

Page 28: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

Progettare la strategia di navigazione in modo che la separa dalla logica di elaborazione. Esso dovrebbe consentire agli utenti di navigare facilmente attraverso le schermate o le pagine. La progettazione di una navigazione coerente nell'applicazione aiuterà a ridurre al minimo la confusione degli utenti così come la riduzione dell’apparente complessità della domanda.

Layout di pagina (User Interface):

Si deve progettare l’applicazione in modo che il layout della pagina può essere separata dai componenti specifici dell’interfaccia utente e dall'elaborazione del tale. Quando si sceglie una strategia di layout, bisogna valutare un approccio che non richiede la codifica o l'utilizzo di strumenti orientati allo sviluppo.

Renderizzazione delle pagine:

Quando si progetta il rendering della pagina, è necessario assicurarsi che si esegue il rendering delle pagine in modo efficiente e massimizzare l'usabilità dell'interfaccia. Da considerare l'uso di AJAX per un'esperienza utente migliorata e una migliore reattività.

Oggetti di presentazione:

Gli oggetti di presentazione memorizzano i dati che verranno utilizzati per gestire lo strato della presentazione. Questi oggetti non sono sempre necessari. Sono da considerare solo se gli insiemi di dati che devono essere conservati sono sufficientemente di grandi dimensioni, complessi o la loro esistenza sta separatamente da controlli di interfaccia utente.

L'elaborazione della richiesta:

Quando si progetta una strategia di elaborazione richiesta, si dovrebbe garantire la distinzione delle preoccupazioni da parte della logica di elaborazione della richiesta separatamente dall’interfaccia utente.

Gestione della sessione:

Durante la progettazione di un'applicazione Web, un’efficiente e sicura strategia di gestione della sessione è importante per le prestazioni e l'affidabilità. È necessario considerare fattori come la gestione della sessione come quello di immagazzinare, dove metterlo, e per quanto tempo le informazioni saranno mantenute.

Convalida:

Page 29: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

29

Progettare una soluzione effettiva di convalida è importante per la sicurezza e l'affidabilità dell’applicazione. Un autorizzazione improprio o debole può lasciare l'applicazione vulnerabile agli attacchi di ingresso.

Test e considerazioni sulla testabilità: Testabilità è una misura di quanto un sistema o dei componenti consentono di creare

criteri di prova ed eseguire test per determinare se i criteri sono rispettati. Si dovrebbe

prendere in considerazione la testabilità prima che si inizia a progettare l'architettura

perché rende più facile diagnosticare prima i problemi e ridurre costi di manutenzione. Per

migliorare la testabilità dell’applicazione, è possibile utilizzare la registrazione degli eventi,

fornire risorse di monitoraggio, e implementare le interfacce di test.

Considerazioni sulle prestazioni:

È necessario identificare gli obiettivi di prestazioni, già in fase di progettazione di

un'applicazione Web raccogliendo i requisiti non funzionali. Il tempo di risposta, throughput,

CPU, memoria e Input / Output su disco sono alcuni dei fattori chiave necessari a

considerare durante la progettazione dell'applicazione.

Considerazioni sulla sicurezza:

La sicurezza è un fattore importante per proteggere l'integrità e riservatezza dei dati

e le risorse dell’applicazione web. Si consiglia di progettare una strategia di sicurezza per

l'applicazione Web che utilizza le soluzioni di sicurezza testate e provate e implementare

l'autenticazione, autorizzazione e convalida dei dati per proteggere l'applicazione da una

serie di minacce.

3.2.3 Stratificazione

L'utilizzo dei layer in un disegno permette di separare le funzionalità in diverse aree di

preoccupazione. In altre parole, i livelli rappresentano il gruppo logico dei componenti

all'interno del disegno. Si dovrebbe anche definire le linee guida per la comunicazione tra i

livelli. Ad esempio, il livello A può accedere il livello B, ma il livello B non può accedere al

livello A. I livelli dovrebbero rappresentare un raggruppamento logico di componenti. Ad

esempio, utilizzare livelli separati per 1) l'interfaccia utente, 2) logica di business, 3)i

componenti di accesso ai dati e 4) il livello di servizi (facoltativo).

Lo strato di presentazione:

Page 30: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

Il livello di presentazione dell'applicazione Web serve a visualizzare l'interfaccia utente e facilita l’interazione con l'utente. Il design dovrebbe concentrarsi sulla separazione degli interessi, dove la logica dell'interazione con l'utente è disaccoppiato dai componenti dell'interfaccia.

Lo strato di Business:

Durante la progettazione di livello aziendale per l'applicazione Web, considerare come implementare la logica di business e flusso di lavoro(workflow) in esecuzione a lunga durata. Disegnare le entità commerciali che rappresentano i veri dati nel mondo reale, e utilizzare questi per passare dati tra i componenti.

Lo strato di dati:

Progettare un livello di dati per l'applicazione Web di astrarre la logica necessaria per accedere al database. Utilizzando un livello separato dati rende l'applicazione più semplice da configurare e mantenere. Lo strato di dati può anche avere bisogno di accedere ai servizi esterni che utilizzano agenti di servizio.

Lo strato dei servizi:

Si consideri la progettazione di un livello di servizio separato se si preveda di distribuire il livello di business su uno strato a distanza, o se si prevede di esporre la logica di business utilizzando un servizio web.

Figura 10: La soluzione tecnica del sistema

3.2.4 Considerazioni sulla distribuzione

Durante la distribuzione di un'applicazione Web, si dovrebbe prendere in

considerazione come la posizione di ogni strato e componente influenzerà le prestazioni, la

scalabilità e la sicurezza dell'applicazione. Utilizzare un approccio distribuito o non

distribuito, a seconda delle esigenze aziendali e dei vincoli infrastrutturali.

Page 31: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

31

Applicazioni non distribuite:

In uno scenario non distribuito,

tutti gli strati logicamente separati

dell’applicazione Web si trovano

fisicamente nello stesso server Web, ad

eccezione del DB. È necessario

considerare come l'applicazione di gestire

più utenti contemporaneamente, e per

come garantire la strati che risiedono sullo

stesso server. La Figura 11 mostra questo

scenario.

Figura 11: Un’applicazione Web non distribuita

Applicazioni distribuite:

Nello scenario distribuito, i livelli di presentazione e di business dell'applicazione Web

risiedono su distinti livelli fisici, e comunicano a distanza. In genere si localizzano il livello di

logica di business e livelli di accesso ai dati sullo stesso server. La Figura 12Error! Reference

source not found. mostra questo scenario.

Figura 12: Un’applicazione Web distribuita

Considerazioni sulla tecnologia:

Sulla piattaforma Microsoft, da un punto di vista ASP.NET, è possibile combinare il

modello ASP.NET Web Forms con una serie di altre tecnologie, tra cui ASP.NET AJAX,

ASP.NET MVC, Silverlight e ASP.NET Dynamic Data.

Considerate le seguenti linee guida:

Se si desidera creare applicazioni a cui si accede tramite un browser Web o user

agent specializzato, considerare l'utilizzo di ASP.NET.

Se si vuole costruire applicazioni che offrono una maggiore interattività e

l'elaborazione in background, con un minor numero di refresh della pagina, è

consigliabile utilizzare ASP.NET AJAX (aka ATLAS).

Page 32: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

Se si vuole costruire applicazioni che includono contenuti multimediali e interattività,

considerare l'utilizzo di ASP.NET con controlli di Silverlight.

Se si utilizza ASP.NET, considerare l'utilizzo di pagine master per attuare una

coerente interfaccia utente in tutte le pagine.

Se si sta creando un'applicazione Web basata sui dati con pagine basate sul modello

di dati del database sottostante, è consigliabile utilizzare ASP.NET Dynamic Data.

3.2.5 User Experience (UX)

L’ultimo argomento, ma non meno importante degli altri citati in precedenza è

l’esperienza dell’utente finale. L’User eXperience è una disciplina decisamente importante

quando si sviluppa un sito web, permette infatti di capire i problemi degli utenti, i bisogni

delle aziende, i requisiti che quel dato sito dovrà avere.

Con il termine di user experience (in italiano esperienza utente), s’intende

l’esperienza vissuta dall’utente nel momento in cui interagisce con una interfaccia web o

con altre tecnologie digitali. Nel caso dell’interfaccia di un sito web, per misurare la qualità

dell’esperienza che l’utente ha nell’interagire con essa, spesso e volentieri si ricorre allo

strumento dei test su persone non coinvolte nel progetto.

In base ai comportamenti e alle scelte intraprese dai tester nell’utilizzare una determinata

interfaccia grafica, si possono trarre le opportune considerazioni in merito all’usabilità del

progetto stesso. In sostanza, permette di creare un sito (o, in generale, un’applicazione) più

usabile.

Progettare per una user experience efficace può essere fondamentale per il successo

dell’applicazione. Se la navigazione è difficile, se gli utenti vengono indirizzati alle pagine

inaspettato, l'esperienza utente può essere negativo.

3.3 Presentazione

Pur avendo a disposizione il codice sorgente delle applicazioni attualmente a

disposizione del dipartimento, le loro interfacce utente sono completamente differenti,

quindi si rende così necessario lo sviluppo ex novo dell'interfaccia utente e della logica

sottostante. Questa scelta è stata giustificata anche perché è stato deciso di migrare dalla

piattaforma desktop-based a quella Web.

L'interfaccia utente è stata progettata con l'intento di renderla il più semplice

possibile. Si è quindi deciso di creare una struttura paginata; ogni pagina implementa un

caso d'uso tra quelli principali. Si è cercato inoltre di rendere le pagine più simili possibili,

semplificando così l'apprendimento dell'interfaccia all'utente finale.

Page 33: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

33

Inoltre, per non far sentire l’utente finale in difficoltà (come il pesce fuor d’acqua) di

trovare qualcosa o andare nell’area specifica d’interesse, è stato ideato un menù

‘intelligente’ alla sinistra del sito nel quale compaiono i collegamenti di navigazione solo

sulle pagine consentite per quello specifico ruolo in cui l’utente appartiene. Questi

collegamenti sono raggruppati per la similitudine dell’operazione che offrono. Ogni raccolta

contiene una pagina di default in cui vengono elencati i collegamenti insieme con una breve

descrizione per ognuna. In più, c’è anche una menù di navigazione a barra, la quale mostra

sempre il collegamento con la pagina principale e il punto della posizione attuale della

navigazione nella gerarchia delle pagine.

3.4 Scelte progettuali

Affrontiamo qui la descrizione delle scelte progettuali, in particolar modo mettendo

in risalto le tecnologie software scelte per l’implementazione del nostro sistema. Si fornisce

una panoramica del progetto .NET di Microsoft e del linguaggio C# scelto come linguaggio di

sviluppo. Si passerà poi a trattare il middleware della logica di business, per finire a

descrivere le modalità di accesso ai dati dell’applicativo, descrivendo come sia possibile

associare svariati controlli alle tabelle del nostro Data Base.

3.4.1 ASP.NET

ASP.NET è un insieme di tecnologie di sviluppo di software per il web,

commercializzate dalla Microsoft. Utilizzando queste tecnologie gli sviluppatori possono

realizzare applicazioni Web e servizi Web (Web Services).

Sebbene il nome ASP.NET derivi da ASP (Active Server Pages, la vecchia tecnologia

per lo sviluppo web di Microsoft), esistono sostanziali differenze fra le due. Infatti ASP.NET

si basa, come tutte le applicazioni della famiglia Microsoft .NET, sul CLR (Common Language

Runtime).

Gli sviluppatori possono scrivere codice utilizzando uno qualsiasi dei linguaggi di alto

livello supportati dal Framework .NET (libreria di classi) .NET come, ad esempio, Visual Basic

.Net (proprietario Microsoft), C# (linguaggio soggetto a una specifica di standardizzazione),

J# (J sharp, derivato da Java), ma anche, molti altri linguaggi open source (e non), come Perl

e Python, questo è possibile poiché il CLR è stato standardizzato presso ECMA. Le

applicazioni ASP.NET sono significativamente più veloci e performanti rispetto a quelle

realizzate utilizzando altre tecnologie di scripting, in quanto l'intero codice del sito web è

pre-compilato in pochi file dll (spesso in un unico file) gestiti da un server Web.

Page 34: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

ASP.NET si propone di semplificare la migrazione degli sviluppatori dalle applicazioni

Windows alle applicazioni web mettendoli in grado di generare pagine composte da tanti

controlli widget, del tutto simili a quelli usati dall'interfaccia utente di Windows.

Un controllo web, come ad esempio un pulsante o un etichetta (label), funzionano in

modo molto simile a quello delle loro controparti Windows: il codice ad essi associato può

assegnare loro determinate proprietà ed eseguire azioni in risposta ad eventi ad essi

associati (ad esempio alla pressione di un pulsante). La differenza sta nel fatto che, mentre i

controlli Windows disegnano sé stessi sullo schermo, i controlli web producono blocchi di

codice HTML che si vanno ad inserire automaticamente nella pagina che deve essere inviata

al browser dell'utente finale.

La vasta disponibilità di controlli, classi e strumenti di sviluppo consente di ridurre

sensibilmente i tempi di sviluppo dei moduli software, e mette lo sviluppatore in condizione

di riutilizzare facilmente uno stesso codice in applicazioni differenti. ASP.NET ha inoltre

semplificato significativamente le funzionalità di accesso ai dati rispetto ad ASP. Ad

esempio, è molto più semplice ed immediato generare una pagina contenente una lista di

dati prelevati da un database.

3.4.2 C#

Sebbene la piattaforma .NET non obblighi nessun programmatore nel scegliere un

qualsiasi dei linguaggi di alto livello supportati dal Framework, è stato opportuno trarne i

benefici offerti dal C#, abbastanza consolidato anche se nato nell’ultimo decennio.

C# (C Sharp) è un linguaggio di programmazione ad alto livello, orientato agli oggetti,

sviluppato dalla stessa Microsoft all'interno dell'iniziativa .NET, e in seguito approvato come

standard ECMA. La sintassi del C# prende spunto da quella della Delphi (hanno il medesimo

autore, Anders Hejlsberg), del C++, da quella di Java e da Visual Basic per gli strumenti di

programmazione visuale e per la sua semplicità (meno simbolismo rispetto a C++, meno

elementi decorativi rispetto a Java).

C# è, in un certo senso, il linguaggio che meglio degli altri descrive le linee guida sulle

quali ogni programma .NET viene eseguito; questo linguaggio, infatti, è stato creato da

Microsoft specificatamente per la programmazione nel Framework .NET. I suoi tipi di dati

"primitivi" hanno una corrispondenza univoca con i tipi .NET e molte delle sue astrazioni,

come classi, interfacce, delegati ed eccezioni, sono particolarmente adatte a gestire il .NET

Framework.

3.4.3 Windows Communication Foundation

Page 35: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

35

WCF è un "sottosistema applicativo" proprietario della Microsoft, che offre la

struttura API per la creazione di applicazioni distribuite in ambienti Windows. Se da un lato

ogni protocollo di rete (ad esempio HTTP, FTP, SMTP, ecc.) ha un suo modello di

programmazione, e necessita quindi di una conoscenza specifica da parte degli sviluppatori

per poter essere utilizzata, WCF è stato realizzato con l'intento di ricondurre ad un unico

modello diverse tecnologie, rendendo più semplice ed uniforme la programmazione in

ambiente Windows.

In particolare, WCF RIA Services 7fornisce il controllo DomainDataSource per

semplificare l'interazione tra l’interfaccia utente e dati da un contesto di dominio. Con il

DomainDataSource è possibile recuperare, adattare e modificare dati usando solo la sintassi

dichiarativa. Con quest’oggetto si può fare il carico, il filtraggio, il raggruppamento e

l’ordinamento di raccolte di dati in modo più facile e trasparente. Si specifica il contesto di

dominio da utilizzare con la DomainDataSource, e quindi chiamare le operazioni che sono

disponibili attraverso tale contesto di dominio.

3.4.4 Dynamic Data (DD)

ASP.NET Dynamic Data è un framework di ponteggi ispirato da Ruby on Rails, fornito

come estensione ad ASP.NET, che consente di generare un sito web completo partendo da

un modello dei dati. Espone le tabelle di un database codificandole nell’URI dei Web Service

ASP.NET, e i dati nella tabella vengono automaticamente presentati in HTML. Il processo di

rendering può essere controllato utilizzando la progettazione di modelli personalizzati.

Internamente, si scopre lo schema di database utilizzando i metadati del DB.

Un altro aspetto importante riguarda il motore di routing su cui si basano, che

consente di non legare l’url che chiamiamo nel browser per richiedere una specifica pagina

la dove risieda, oppure come questa si chiami. Inoltre è possibile modificare il

comportamento del motore di routing tramite delle regole, in un unico punto, senza dover

modificare nulla nelle singole pagine e come queste si richiamino tra di loro.

In conclusione, i DD vanno ad arricchire le funzionalità delle WebForms, offrendo un

framework per realizzare applicazioni web orientate ai dati. I DD offrono comunque un

meccanismo che permette molte forme di personalizzazione, permettono di usare dei

template particolari per fare il rendering di campi specifici di una tabella usando ad esempio

i controlli dell’AJAX Control Toolkit o di terze parti ad esempio per selezionare un

calendario, oppure uno slider per decidere una quantità numerica. Le pagine degli ASP.NET

Dynamic Data sono già pensate per sfruttare i controlli ASP.NET AJAX. Altri attributi

consentono di impostare delle regole di validazione sul modello dei dati, ad esempio si può

7 WCF RIA Services fornisce un framework end-to-end per semplificare la creazione di applicazioni tradizionali

n-tier data-driven con Microsoft Silverlight, ASP.NET e WCF.

Page 36: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

impostare tali regole direttamente sulle proprietà delle classi generate dal modello dei dati,

creando delle classi parziali. Questo meccanismo consente di accentrare le regole di

validazione, che poi “fluiscono” nell’UI e valgono in qualsiasi pagina web si faccia

riferimento a quella specifica classe.

3.4.5 Entity Framework

Entity Framework è il nuovo O/RM8 realizzato da Microsoft basato interamente sul

.NET Framework. EF fa l’astrazione dello schema relazionale (logico) dei dati che vengono

memorizzati in un database e presenta il suo schema concettuale per l'applicazione.

Quest’astrazione elimina la mancata corrispondenza relazionale a oggetti che generalmente

è comune nei classici programmi orientati ai database.

Per esempio, in un sistema convenzionale di database-oriented, le voci su un cliente

e le loro informazioni possono essere memorizzate in una tabella Clienti, i loro ordini in una

tabella Ordini e le loro informazioni di contatto in un altro ancora tabella Contatti.

L'applicazione che si occupa di questo database deve "sapere" quali informazioni sono in

quale tabella, che, cioè, lo schema relazionale dei dati è ‘hardcoded’ nell'applicazione.

Un’altra arma potente dell’EF è il supporto del LINQ come linguaggio di selezione e

manipolazione dati. In genere, le query sui dati vengono espresse come stringhe semplici

senza il controllo dei tipi in fase di compilazione o il supporto IntelliSense. È inoltre

necessario imparare un linguaggio di query diverso per ogni tipo di origine dati: database

SQL, documenti XML, svariati servizi Web e così via. LINQ2Entity (e LINQ in generale) rende

una query un costrutto di linguaggio di prima categoria in C#.

Lo svantaggio di quest’approccio è che se questo schema viene cambiato

l'applicazione non è al riparo dal cambiamento. Inoltre, l'applicazione deve eseguire uno join

SQL per attraversare le relazioni degli elementi di dati al fine di trovare i dati correlati.

Questo modello di relazioni tra gli elementi trasversali è molto diverso dal modello

utilizzato nei linguaggi di programmazione object-oriented, dove sono esposte le relazioni

delle caratteristiche di un oggetto come proprietà dell'oggetto e l'accesso alla proprietà

attraversa il rapporto. EF consente di scrivere i programmi con le classi che vengono

generate da questo livello concettuale. Il framework gestisce quindi tutta la traduzione

richiesta, come si estraggono i dati dal database e inviare di nuovo dentro di esso.

8 L' Object-Relational Mapping è una tecnica di programmazione che favorisce l'integrazione di sistemi SW

aderenti al paradigma della programmazione orientata agli oggetti con sistemi RDBMS. Vedi 4.2.2 ORM

Page 37: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

37

Capitolo 4 – Realizzazione

a fase di realizzazione (o meglio conosciuta come la codifica) è la fase in cui le

idee sviluppate nella progettazione vengono implementate concretamente

attraverso la creazione dei moduli funzionali e la loro progressiva integrazione.

In questo capitolo sarà descritto il tentativo verso l’approccio RIA e argomentato perché non

era adatto per il sistema. In seguito saranno elencate le principali funzionalità

dell’applicativo.

4.1 Rich Internet Applications, un primo tentativo

Si tratta di una versione di prova che poi è stata abbandonata, rimpiazzata

totalmente dall’AJAX. RIA, essendo un modello nuovo nella classe di sviluppo di applicazioni

web, presenta ancora delle problematiche che riguardano principalmente la sicurezza,

l’usabilità, l’ottimizzazione e la navigazione. In seguito verrà fatto un’analisi superficiale di

questo modello evidenziando i suoi punti di forza e debolezza.

Tramite il modello RIA è possibile realizzare applicazioni web il cui comportamento è

molto simile a quello di un’applicazione stand-alone desktop. Ma, il proliferare di

applicazioni di questo genere introduce una serie di aspetti legati a problematiche

tecnologiche, architetturali e anche mentali.

Dal giorno della sua prima definizione9, il termine di Rich Internet Application è

divenuto uno dei più usati e abusati sul web; da allora nuove tecnologie e nuovi modelli di

programmazione si sono avvicendati sullo scenario con l’obiettivo, fra le altre cose, di

aumentare la potenza e l’interattività delle GUI delle applicazioni al fine di far sì che la

cosiddetta user experience fosse paragonabile a quella di una comune applicazione desktop.

Probabilmente l’invenzione di Ajax (meglio chiamarla "la scoperta") ha rappresentato

l’impulso principale per la diffusione di sempre nuove e migliori tecnologie dall’interfaccia

ricca.

Un’applicazione RIA è spesso più “bella da vedere”, più ricca, più intuitiva da usare,

in breve è un’applicazione migliore. Le RIA si caratterizzano per la dimensione interattiva, la

multimedialità e per la velocità d'esecuzione. Infatti, la parte dell'applicazione che elabora i

dati è trasferita a livello client e fornisce una pronta risposta all'interfaccia utente, mentre la

gran parte dei dati e dell'applicazione rimane sul server remoto, con notevole

9 “Le Rich Internet Application (RIA) sono applicazioni web che possiedono le caratteristiche e

le funzionalità delle applicazioni desktop, senza però necessitare dell'installazione sul disco fisso.” – Macromedia, 2002

L

Page 38: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

alleggerimento per il computer utente. Le RIA si fondano perciò su un'architettura di tipo

distribuito.

Il set di funzionalità e delle caratteristiche che un’applicazione Rich dovrebbe avere:

applicazione client side

browser embedded

modello a eventi sulla GUI

asincronia delle invocazioni server-side

rich user interface

Figura 13: RIA secondo Macromedia

È bene ricordare che il modello RIA si differenzia molto da quello a pagine e che

alcuni aspetti dello sviluppo di applicazioni per il web rappresentano ancora delle importanti

limitazioni:

Single Page Interface Page Flow

Viene eseguita all’interno del browser e interagisce in modo dinamico con il sistema tramite la proposizione di una GUI ricca di componenti e comportamenti (State Oriented)

Una serie di pagine HTML, ogni pagina rappresenta una vista parziale del sistema nel suo complesso e la visione completa si ha solo grazie alla navigazione ipertestuale pagina dopo pagina. (Page Oriented)

Stateful Stateless

L’applicazione vive nella pagina e con la pagina: non è legata alla cronologia del browser.

Ogni pagina ha il suo ciclo di vita

Ricchezza della GUI e la capacità di interagire con l’utente senza la necessità di ricaricare la pagina per ogni click o azione dell'utente

Il problema dell’User eXperience viene risolto parzialmente con la scoperta dell’AJAX.

Installazione di software aggiuntivo o plug-in oltre al browser

All’utente basta il browser, ed eventualmente script-enabled per AJAX.

Una parte della logica viene spedita al client -> più veloce.

Tutta la logica risiede nel server

Difficile / impossibile permettere il segnalibro di un determinato stato dell’applicazione.

Non ci sono problemi

una rich application difficilmente può essere scandagliata da un crawler di un motore di ricerca.

Non ci sono problemi

Eseguire un’app. remotamente fa nascere I problemi di sicurezza ci sono, ma di un

Page 39: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

39

una serie di problematiche tipiche di attacchi "Man in the middle" o "JS-Injection”.

grado meno elevato paragonato con SPI.

OOP vero e proprio Fastidio dallo scripting e tag o custom tag in parte proprietari

UI Definition ancora giovane Templating e UI Definition rapido

La gestione delle singole risorse è meno semplice.

La gestione e il controllo delle singole componenti (pagine o business objects per le applicazioni tradizionali, così come pannelli, window dialog per le RIA) risulta più dettagliatamente definibile.

Figura 14: La versione RIA del progetto

In conclusione si può dire che le applicazioni RIA sono migliori per quanto concerne

la modalità di utilizzo da parte dell’utente e per alcuni aspetti implementativi. L’utilizzo di

queste applicazioni porta con sé alcune problematiche spesso derivanti dal fatto che per

anni siamo stati abituati a ragionare con applicazioni a pagine, che funzionano come

macchine a stati per le quali sono state inventate trucchi e barbatrucchi per risolvere i

problemi di questo modello. Tali soluzioni non funzionano con il modello RIA:

probabilmente è il modello stesso che se affrontato con una mentalità a pagine si troverà in

difficoltà. Non è illogico pensare che, cambiando approccio (da page oriented a state

oriented), spariranno molti dei problemi per i quali le soluzioni derivanti dal modello web

non funzionano con l’approccio rich.

Page 40: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

Alcune problematiche restano, in effetti, poco gestibili nel modello rich per cui c’è da

attendersi che presto verranno rese disponibili soluzioni ufficiali e integrate.

4.2 Persistenza di dati

Introduzione

Rimane in sospeso un problema molto sentito, ovvero come memorizzare gli oggetti

su disco e come recuperarli. Questo problema, che viene in genere detto di "persistenza dei

dati", è di soluzione tutt'altro che immediata, e può essere affrontato a due differenti livelli:

1. Utilizzando un database orientato agli oggetti. In questo caso, la persistenza degli

oggetti è garantita dal database stesso. I database object oriented sono relativamente

nuovi, e non vi sono molti prodotti commerciali disponibili. In ogni caso, esistono sia

prodotti stand-alone (equiparabili a un tradizionale package con funzionalità di

database) sia librerie che possono essere utilizzate con linguaggi tradizionali.

2. Implementando una soluzione all'interno di un normale linguaggio object oriented.

Quindi dovremo in genere definire manualmente, per ogni classe, alcuni metodi che si

occuperanno della gestione specifica dei nostri dati.

Uno dei metodi per rappresentare gli oggetti è quello di far riferimento al modello

relazionale; in questo caso, è molto vantaggioso sfruttare una delle tante librerie esistenti

per la gestione relazionale dei dati. Di norma, ciò richiederà comunque la creazione di

alcune classi "adattatore" che isolino la visione relazionale (verso il database) e quella

orientata agli oggetti (verso i clienti della classe). Può comunque essere una scelta

vantaggiosa in numerosi casi, ad esempio quando esistano esigenze di condivisione con una

base dati esistente (come nel caso trattato in questo elaborato) o d’interoperabilità con altri

prodotti basati sul modello relazionale.

4.2.1 Data first vs. Model first

Alcune persone trovano l'atto di categorizzazione e di astrazione naturale e

gratificante, altri trovano frustrante e inutile. Il problema con le tecnologie dell'informazione

è che i programmatori di computer sono suscettibili di rientrare nella prima categoria e gli

utilizzatori di tali programmi sono suscettibili di cadere in un secondo.

Ad esempio, il file system. I file e le cartelle sono concetti che sono stati inventati da

persone che hanno gestito le tonnellate d’informazioni su carta e, per questo, gli piaceva la

categorizzazione e l’astrazione ... agli utenti normali non lo fanno! Guardate la vettura,

Page 41: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

41

scrivania, sala, ripostiglio ... sono tutte perfettamente ordinate e strutturate, etichettati e

ben categorizzate? Se è più facile / più veloce per trovare qualcosa in otto miliardi di pagine

del web che nella tua raccolta di 100 mila file (inclusi documenti, mail, immagini, ecc.), c'è

qualche problema.

Un altro esempio è il paragone tra i fogli di calcolo contro basi di dati. Entrambi sono

basati su tabelle, righe essendo gli elementi, le colonne sono i loro attributi. Entrambe

permettono le relazioni. Fogli di calcolo (non basi di dati!) sono stati i motivi per cui la gente

ha speso $ 10K su un personal computer nei primi anni 80.

E se vogliamo ancora un altro esempio: i blog vs CMS. E gli esempi non finiscono se

vogliamo continuare. Tutti questi esempi sono elencati solo per illustrare che la strategia

“Data First” ha un'efficienza e usabilità superiore (a parità di tutte le altre) che la strategia

“Model First”.

Le ragioni non sono così evidenti:

I. Data First è come imparare le lingue e di come si evolvono. Costruiamo regole,

modelli, astrazioni e categorie nella nostra mente dopo aver raccolto informazioni,

non prima. Per questo motivo è più facile imparare un linguaggio di programmazione

da esempi che dalla sua teoria, o una lingua naturale da solo di essere esposti a esso,

invece di conoscere tutte le regole ed eccezioni.

II. Data First è più reversibile in modo incrementale, la complessità del sistema è

aggiunta in modo più graduale, ed è più facilmente tornare indietro.

III. A quanto detto sopra, il ritorno del capitale investito (ROI) del Data First è più

immediatamente percepibile.

Quindi, nella situazione che il modello dei dati cambia poco o niente nell’arco del tempo

sarebbe più opportuno scegliere questa strategia.

4.2.2 ORM

Il passo successivo è sfruttarsi il vantaggio di un framework Object-Relational

Mapping, ovvero una libreria in grado di mappare oggetti su Database Relazionali e

viceversa (ORM è una tecnica di programmazione10 che favorisce l'integrazione di sistemi

software aderenti al paradigma della programmazione orientata agli oggetti con sistemi

RDBMS). L'uso di un ORM favorisce il raggiungimento di più alti standard qualitativi

software, migliorando in particolare le caratteristiche di correttezza, manutenibilità,

evolvibilità e portabilità. Un prodotto ORM fornisce, mediante un'interfaccia orientata agli

10

In pratica un ORM implementa il pattern Data Mapper ed è in grado di gestire la persistenza di oggetti, termine che indica genericamente l'operazione di salvataggio dello stato dell'oggetto su un supporto stabile. (Martin Fowler - Patterns of Enterprise Application Architecture)

Page 42: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

oggetti, tutti i servizi inerenti alla persistenza dei dati, astraendo nello stesso tempo le

caratteristiche implementative dello specifico RDBMS utilizzato.

I principali vantaggi nell'uso di un tale sistema sono i seguenti.

Il superamento (più o meno completo) dell'incompatibilità di fondo tra il progetto

orientato agli oggetti ed il modello relazionale sul quale è basata la maggior parte

degli attuali RDBMS utilizzati; con una metafora legata al mondo dell'elettrotecnica,

si parla in questo caso di disadattamento dell'impedenza tra paradigma relazionale e

ad - oggetti (object/relational impedance mismatch).

Un'elevata portabilità rispetto alla tecnologia DBMS utilizzata: cambiando DBMS non

devono essere riscritte le routine che implementano lo strato di persistenza;

generalmente basta cambiare poche righe nella configurazione del prodotto per

l'ORM utilizzato.

Rilevante riduzione della quantità di codice da redigere; l'ORM maschera dietro

semplici comandi le complesse attività di creazione, prelievo, aggiornamento ed

eliminazione dei dati (dette CRUD - Create, Read, Update, Delete). Tali attività

occupano di solito una buona percentuale del tempo di stesura, testing e

manutenzione complessiva. Inoltre, sono per loro natura molto ripetitive e, dunque,

favoriscono la possibilità che vengano commessi errori durante la stesura del codice

che le implementa.

Suggerisce la realizzazione dell'architettura di un sistema software mediante

approccio stratificato, tendendo pertanto a isolare in un solo livello la logica di

persistenza dei dati, a vantaggio della modularità complessiva del sistema.

Si è scelto il prodotto della casa Microsoft, l’Entity Framework11, il quale usa LINQ

come linguaggio di query (una descrizione più ampia è stata data nella sezione 3.4.5). Il

framework offre nativamente funzionalità che altrimenti andrebbero realizzate

manualmente dal programmatore. Per citarne alcune:

Caricamento automatico del grafo degli oggetti secondo i legami d'associazione

definiti a livello di linguaggio. Il caricamento di un'ipotetica istanza della classe

Utente, potrebbe automaticamente produrre il caricamento dei dati collegati sui

Reagenti in prestito. Tale caricamento, in più, può avvenire solo se il dato è

effettivamente richiesto dal programma, ed è altrimenti evitato (tecnica nota con il

nome di lazy-initialization).

11

Da non scartare anche NHibernate; un’alternativa valida del EF e abbastanza completa, ma supportata pochissimo dal IDE VisualStudio

Page 43: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

43

Gestione della concorrenza nell'accesso ai dati durante conversazioni. Conflitti

durante la modifica di un dato da parte di più utenti in contemporanea, possono

essere automaticamente rilevati dal sistema ORM.

Meccanismi di caching dei dati. Per esempio, se accade che uno stesso dato sia

prelevato più volte dal RDBMS, il sistema ORM può fornire automaticamente un

supporto al caching che migliori le prestazioni dell'applicazione e riduca il carico sul

sistema DBMS.

Gestione di una conversazione mediante uso del design pattern Unit of Work, che

ritarda tutte le azioni di aggiornamento dei dati al momento della chiusura della

conversazione; in questo modo le richieste inviate al RDBMS sono quelle

strettamente indispensabili (per es. viene eseguita solo l'ultima di una serie di

aggiornamenti su uno stesso dato, oppure non viene eseguita affatto una serie di

aggiornamenti su di un dato che in seguito viene eliminato); inoltre il colloquio con il

DBMS avviene mediante composizione di query multiple in un unico statement,

limitando così al minimo il numero di round-trip-time richiesti e, conseguentemente,

i tempi di risposta dell'applicazione.

La mappatura 1-1 tra le tabelle, viste e stored procedure con le classi di tipo business

objects. Tale operazione permette al programmatore di eseguire tutte le operazioni

su oggetti senza aver la minima idea dello schema del database, né del linguaggio

d’interrogazione SQL. Quest’approccio separa due profili nettamente distinti.

Conclusioni

Ancora una volta, il passaggio al paradigma object oriented non significa il rifiuto dei

concetti già consolidati in altri settori dell'informatica: in particolare, il trattamento dei dati

e delle relazioni ha molto in comune, ma anche grandi punti di distacco, con il modello

relazionale. Non è raro che esperti di diverso calibro affermino che il paradigma object

oriented rappresenta una totale rottura con il passato, e che conoscenze precedenti

possono essere controproducenti nella transizione ai nuovi schemi di pensiero: mentre ciò

può essere vero per alcune tecniche di programmazione a basso livello, spesso le

conoscenze acquisite in campi più astratti, non solo non sono d’impaccio, ma costituiscono

anche un utile strumento per la comprensione e la progettazione dei sistemi.

4.3 Logica funzionale

Con il termine Business Logic ci si riferisce a tutta quella logica applicativa che rende

operativa un'applicazione. E’ un termine non-tecnico generalmente usato per descrivere le

funzionalità degli algoritmi che gestiscono lo scambio d’informazioni tra un database e

Page 44: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

un’interfaccia utente. Il business logic racchiude in sé regole cosiddette di "business",

piuttosto che regole ed elementi legati alla visualizzazione delle informazioni (interfaccia

grafica) o alla memorizzazione dei dati (es. database, repository, cloud storage, ecc.).

È un termine largamente utilizzato nella progettazione del software per individuare

un componente software, un layer (o tier, cioè livello) di un’architettura software, ecc. Il

business logic è spesso associato ad architetture software di tipo a tre strati.

4.3.1 Ambito di applicazione della logica di business

Logica di business:

modella la vita reale di Business Objects (come i conti, prestito, itinerari e scorte.)

prescrive come gli oggetti di business interagiscono tra loro.

applica i percorsi e le modalità con cui gli oggetti di business sono accessibili e

aggiornati.

La logica di business è costituita da:

regole di business che esprimono la politica commerciale (come i canali, l'ubicazione,

la logistica, i prezzi e prodotti);

flussi di lavoro che sono i compiti ordinati di passare documenti o dati da un

partecipante (una persona o di un sistema software) a un altro.

4.3.2 Posizione della logica di funzionale (Business Logic)

Nelle applicazioni a livello singolo, la logica di business, la logica di presentazione e il

CRUD sono spesso utilizzati, con ognuna di avere la massima conoscenza, o di essere

fortemente accoppiato agli altri. Questo viene visto come problematico, poiché le modifiche

a un risultato richiedono nuove prove alla convalida di tutto il sistema per un singolo

cambiamento. L'intreccio limita anche la misura in cui il CRUD e la logica di business

possono essere riutilizzati.

In un’architettura multistrato (a fronte di architettura multilivello) la logica di

business è un modulo separato. Nell'architettura comune 3-tier, la logica di business, in

teoria, occupa lo strato del livello intermedio, il livello dei servizi di business o di lavoro. In

pratica, la logica aziendale è spesso intrecciata negli altri due livelli (il livello di servizi per gli

utenti e il livello di servizi di database), come da logica di business di codifica in stored

procedure e nelle decisioni sulla convalida d’input e la formattazione del display. Tuttavia

non c'è una regola ben definita.

Page 45: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

45

Nel sistema costruito la logica è sparsa sia sulle stored procedure sia sullo strato

della logica. Infatti, per le regole assai complicate è di buone prassi di incapsularle sulle SP,

mentre per le altre operazioni quotidiane (specialmente nell’uso del pattern Master-Detail)

si può permettere piazzarle sullo strato della logica. Questo strato fa uso dei Domain

Services. Per illustrarlo, diamo un semplice esempio:

//----------------Prestito & Restituzione------------------------------

public int ExecPrestito(int IDReagente, double quantita, string username, int locazione) { return this.ObjectContext.spPrestito(IDReagente, quantita, username, locazione); } public int ExecRestituzione(int IDPrelievo, int IDLocazione) { return this.ObjectContext.spRestituzione(IDPrelievo, IDLocazione); }

Sono due funzioni implementate per il reso/prelievo di reagenti. Risiedono dentro la classe class ResoPrelievoDomainService : LinqToEntitiesDomainService<DB_DipartimentoEntities>

Prendono i parametri d’input e li restituiscono alle stored procedure corrispondenti, le quali

vengono chiamate dall’Entity Framework. Come si vede, con poche righe si gestisce la

persistenza senza preoccuparsene dell’apertura/chiusura della connessione DB oppure di

costruire comandi SQL. Infatti, l’ORM fa l’astrazione del database e restituisce al

programmatore il relativo modello a oggetti.

In seguito sarà approfondito in dettaglio il pattern della logica applicativa.

4.3.3 Il pattern DomainService

I servizi di dominio sono i servizi WCF che incapsulano la logica di business di

un'applicazione. Un servizio di dominio espone una serie di operazioni correlate, sotto

forma di un livello di servizio. Quando si definisce un servizio di dominio, si specificano le

operazioni dati che sono consentiti attraverso il servizio di dominio.

Microsoft. NET RIA Services semplifica il tradizionale modello di applicazione n-tier,

riunendo le piattaforme ASP.NET e Silverlight. RIA Services fornisce uno schema per scrivere

la logica di un’applicazione che si esegue sul middle tier e controlla l'accesso ai dati per le

query, modifiche e operazioni su misura. Fornisce anche supporto end-to-end per le attività

comuni come la validazione dei dati, l'autenticazione e ruoli grazie all'integrazione con

componenti sul client Silverlight e ASP.NET sullo strato intermedio (della logica).

Page 46: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

Quando si progetta un servizio di dominio, si dovrebbe pensare come un insieme di

attività correlate che si prevede agli utenti di eseguire nell'applicazione. Tipicamente, le

attività interessate riguardano un piccolo gruppo di soggetti strettamente connessi. Per

esempio, in una domanda di registrazione degli ordini, si potrebbe esporre gli enti per i noti

ordini, voci e dettagli. Si potrebbe piazzare le entità per i conti e i pagamenti in un servizio di

dominio separato.

Un pattern scalabile12

Ci sono troppe cose che sono non-naturale. La norma, a partire dalla forzata n-tier

(molti sviluppatori sono abituati per scrivere applicazioni 2-tier), asincrona (quando Sync è la

norma), si occupano di latenza (così facendo in modo non corretto ha le potenzialità per

rompere l'esperienza dell'utente finale), cercando di capire come essere meno loquace, si

occupano di convalida, i conflitti, scenari disconnessi o connessi occasionalmente, di

eseguire l'autenticazione dell'utente e lo stato di condivisione tra client e server. L'elenco

potrebbe continuare all'infinito...

Il modello DomainService per scrivere la logica dell'applicazione stessa non è limitato al solo RIA scritte in Silverlight di connessione ad alcuni database relazionali nel retroscena. Questa è una sola fetta di una storia più grande (vedi Figura 1Figura 15).

Figura 15: Domain Services, un pattern scalabile

Il modello DomainService può funzionare contro una vasta varietà di fonti di dati.

Dall'altro lato, abbiamo Silverlight e WPF che rappresenta una parte della storia .NET TO

.NET. Tuttavia, l'infrastruttura in cima di DomainService parla in modo aperto / standard /

RESTful. Come tali script / client AJAX che utilizzano qualsiasi framework Ajax possono

12

Nikhil Kothari - .NET RIA Services: From Vision to Architecture

Page 47: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

47

funzionare (interagire) con il livello intermedio. Le applicazioni server-side di rendering

basato su Web Form o usando MVC possono fare uso della logica dell'applicazione stessa. E,

infine, per i clienti non UI, come altre applicazioni, si può costruire un livello di servizi per

proiettare i dati e le operazioni tramite un’interfaccia SOAP o REST.

Riepilogo

Come già visto sopra, si abbia una tecnologia molto adattabile costruita su blocchi di costruzione che possono essere sostituiti. Si tratta di un pattern scalabile che va al di là delle semplici operazioni CRUD. Alcune caratteristiche sono:

CRUD

Sicurezza (Require Authentication / Authorization / SSLEncryption)

Incapsulamento del Business Logic

Paginazione / Raggruppamento / Filtro sui dati

Validazione dei dati d’input

UnitTest Code

Queries Parallelizabili

4.3.4 Autenticazione/Autorizzazione

In ASP.NET si può utilizzare uno dei seguenti provider di autenticazione: Windows,

Passport e Forms. E’ stata scelta quest’ultima, ma si potrebbe cambiare facilmente

modificando semplicemente il file di configurazione del sito “web.config”.

L’autenticazione basata su Form (chiamata anche autenticazione basata su cookie)

sfrutta un sistema che reindirizza le richieste non autenticate a un form HTML

(personalizzabile) usando il reindirizzamento http client. L'utente che viene indirizzato su

questo form fornisce le credenziali per l'accesso (username e password) e invia il form. Se

l'applicazione autentica la richiesta, viene creato un cookie criptato che contiene le

credenziali dell'utente e informazioni aggiuntive (per esempio i ruoli in questo caso), o una

chiave (ticket) per riacquisire le credenziali. Il browser rinvia questo cookie a ogni richiesta e

l'utente può accedere alle applicazioni, poiché le richieste conservano questo cookie.

In seguito verrà spiegato brevemente il flusso delle richieste – risposte che

avvengono durante l’autenticazione basata su Form.

Page 48: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

Figura 16: La sequenza degli eventi durante l'autenticazione con Form

1. L'utente richiede il file Default.aspx

dalla directory virtuale

dell'applicazione. IIS consente la

richiesta giacché l'accesso anonimo è

attivato nella metabase di IIS. ASP.NET

conferma che l'elemento di

autorizzazione comprende un tag

<negare agli utenti = "?" / >.

2. Il server cerca un cookie di autenticazione. Se non riesce a trovare il cookie di autenticazione, l'utente viene reindirizzato alla pagina di accesso configurato (Login.aspx), come specificato dal loginUrl dell'elemento form. L'utente invia le credenziali attraverso questo form. Informazioni sulla pagina di origine viene inserito nella stringa di query utilizzando RETURNURL come chiave. La risposta del server HTTP è la seguente: 302 Found Location: http://localhost/FormsAuthTest/login.aspx?RETURNURL=%2fFormAuthTest%2fDefault.aspx

3. Il browser richiede la pagina Login.aspx e comprende il RETURNURL parametro nella stringa di query.

4. Il server restituisce la pagina di accesso e il 200 OK codice di stato HTTP.

5. L'utente inserisce le credenziali nella pagina di accesso e posti nella pagina, compreso il RETURNURL parametro dalla stringa di query, di nuovo al server.

6. Il server convalida le credenziali dell’utente rispetto a un archivio, come ad esempio un database SQL Server o di un utente Active Directory. Il codice nella pagina di accesso crea un cookie che contiene un ticket di autenticazione form che si trova per la sessione.

7. Per l'utente autenticato, il server reindirizza il browser all'URL originale che è stato specificato nella stringa di query dal RETURNURL parametro. La risposta del server HTTP è la seguente: 302 Found Location: http://localhost/TestSample/default.aspx

8. Dopo il reindirizzamento, il browser richiede la pagina Default.aspx di nuovo. Questa richiesta comprende il cookie di autenticazione.

9. La classe FormsAuthenticationModule rileva il cookie di autenticazione moduli e autentica l'utente. Dopo l'autenticazione con successo, la classe FormsAuthenticationModule popola la proprietà dell'utente corrente, che è esposta dall'oggetto HttpContext, con informazioni circa l'utente autenticato.

10. Poiché il server ha verificato il cookie di autenticazione, si concede l'accesso e restituisce la pagina Default.aspx.

Page 49: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

49

Nel punto 6 il server può inserire nel cookie (che per altro è crittato) anche i ruoli

associati all’utente. Cosi facendo, oltre a proteggere le pagine dagli utenti anonimi, si limita

la vista delle pagine dedicate ai particolari gruppi o utenti. Per maggiori dettagli

sull’implementazione si consiglia di leggere13 la guida di Microsoft.

4.3.5 Flusso Nuovo Ordine

Le operazioni via codice di un nuovo ordine implementate, seguono la successione e

la logica descritti nel seguente schema a blocchi:

Figura 17: Lo schema a blocchi dell'operazione di un nuovo ordine

4.4 Interfaccia Utente (UI)

L’interfaccia Utente, ovvero i meccanismi che producono l’HTML per l’utente finale,

è realizzata mediante i Web Forms e i DynamicData. Un approccio migliore sarebbe stato

svolgendo con il pattern MVC (o uno dei suoi derivati), comunque, essendo incapsulata la

logica sulle Stored Procedures e sullo strato di Business Logic (DomainService per

l’esattezza) non si otterrebbe qualche vantaggio esaltante. Tra l’altro, sui Web Forms sono

stati aggiunti vari componenti AJAX-like per aumentare la cosiddetta UserExperience e

comunicare con il server in modo asincrono. In generale è stato scelto di proseguire con lo

sviluppo del tipo “1 caso d’uso – 1 pagina”.

E’ stato scelto di usare il Dynamic Data per le funzionalità semplici come la

visualizzazione di cataloghi (sostanze, reagenti, frasi di R/S) e le operazioni di manutenzione

13

ASP.NET Forms Authentication : http://msdn.microsoft.com/en-us/library/Aa302399

Page 50: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

(add new, update, delete) da parte di un amministratore, mentre per i casi d’uso più

laboriosi è stato deciso di implementarli con i Web Forms.

In seguito saranno introdotte queste tecnologie (i paragrafi 4.4.1 e 4.4.2), nonché

verranno mostrati le funzionalità principali (il paragrafo 4.4.3).

4.4.1 Dynamic Data Control

Come si è già anticipato nella 3.4.4, il DDC viene all’aiuto del programmatore quando

si abbia a confronto un’applicazione molto orientata al livello di dati, o delle tabelle del

database. L'infrastruttura che gli sta dietro è molto interessante, perché consente di fare

tutto sfruttando l'object model, che d'altra parte è auto referenziante in quanto al tipo di

dato, alle regole che deve rispettare per la validazione e, dal punto di vista di Entity

Framework, anche della strategia di persistenza.

Sebbene i wizard14 siano comodi in certi scenari, siano anche la cosa peggiore che

uno sviluppatore può trovare, perché spesso gli fanno spegnere il cervello. Tutto ciò

premesso, DDC non è solo un insieme di griglie e controlli di dettaglio, ma anche e

soprattutto un'infrastruttura dedicata allo scopo di visualizzare informazioni e gestirne la

modifica in un'ottica di "mi stresso poco e ottengo il massimo perché ho già il mio modello

di dati pronto". Per esempio l'accoppiata DynamicControl e DynamicField fa egregiamente il

lavoro di consentire l'utilizzo in una normale GridView/DetailsView/FormView, demandando

ad una serie di template separati la possibilità di avere un solo template da visualizzare in

baso al tipo di informazioni, il che consente di risparmiare un bel po' di markup ripetitivo da

scrivere e con pieno supporto per il databinding15 bidirezionale.

Poi è ovvio che con l'URL Routing e DynamiDataManager siano già pronte gran parte

delle funzionalità per farsi un sistema di gestione delle entity con relativa persistenza, ma da

qui a fare di DDC un insieme di "cose" fatte con un wizard ce ne passa.

Instradamento delle richieste mediante Routing

In applicazioni dal contenuto dinamico è frequente l'uso di parametri inseriti in

querystring per caricare informazioni e generare pagine per ogni specifica richiesta. È il

metodo più semplice, per esempio, per indicare il prodotto da caricare in una pagina di

14

il wizard indica una procedura informatica(solitamente procedure predisposte per utenti inesperti), generalmente inglobata in un’applicazione più complessa, che permette all'utente di eseguire determinate operazioni (solitamente complesse) tramite una serie di passi successivi. deriva dall’inglese e significa mago 15

Il Data Binding consente di legare un controllo ad una sorgente dati, riducendo la quantità di codice richiesta.

Page 51: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

51

dettaglio, perché tale parametro si può leggere tramite Request.QueryString o un

QueryStringParameter da associare ai controlli data source.

Per rendere però più comprensibile l'URL si tende a evitare l'uso di querystring,

sfruttando il percorso stesso dell'indirizzo per inserire parametri (come gli ID) e descrizioni o

titoli che permettono all'utente di capire cosa la pagina contiene, oltre a permettere una

migliore indicizzazione da parte dei motori di ricerca.

Per realizzare questa funzionalità con ASP.NET si usa una tecnica chiamata URL

rewriting, che consiste, solitamente tramite HttpModule, nel riscrivere l'indirizzo richiesto

dall'utente mappandolo su HttpHandler, dove normali pagine, estrapolando dall'indirizzo i

parametri e passandoli con varie tecniche, solitamente facendo sempre uso di querystring.

A partire da ASP.NET 2.0 è consentito mappare un indirizzo su un altro in modo molto

semplice, tramite la sezione system.web/urlMapping, come mostrato nell'esempio

seguente:

<urlMappings enabled="true">

<add url= "~/Sostanza1.aspx"

mappedUrl="~/ Sostanze.aspx? SostanzaID=1"/>

</urlMappings>

Questa sezione purtroppo è abbastanza limitata e non permette scenari più

complessi dove sono richieste la validazione dei valori predefiniti o l'uso di HttpHandler,

costringendo lo sviluppatore alla creazione di un HttpModule personalizzato che implementi

la logica specifica.

A partire da ASP.NET 3.5 SP1 è presente un nuovo assembly System.Web.Routing,

per facilitare questi scenari, che contiene principalmente un modulo per l'instradamento

delle richieste. Sebbene possa sembrare un rimpiazzamento del mapping degli URL, in realtà

è qualcosa di più evoluto che non si limita alla semplice riscrittura dell'indirizzo, ma

reimposta l'HttpHandler che prende in carico la richiesta. Tra URL rewritng e URL routing c'è

quindi molta differenza ed è bene tenerlo a mente, sebbene il risultato sia spesso simile.

Innanzitutto per sfruttare questa nuova caratteristica è necessario referenziare il

nuovo assembly e configurare nel web.config il modulo, come mostrato nell'esempio

seguente:

<httpModules>

<add name="UrlRoutingModule"

type="System.Web.Routing.UrlRoutingModule,

System.Web.Routing, Version=4.0.0, Culture=neutral,

PublicKeyToken=31BF3856AD364E35"/>

</httpModules>

Il modulo appena aggiunto intercetta tutte le richieste e utilizza una tabella,

accessibile tramite la proprietà statica RouteTable.Routes, per ottenere la RouteData per

ognuna di esse. La definizione di tale tabella può essere creata o modificata in qualsiasi

Page 52: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

momento, ma quello migliore è tipicamente l'avvio dell'applicazione, così da rendere

operativi fin da subito gli instradamenti. La tabella da definire consiste in una coppia

formata dal nome e dalla classe astratta RouteBase, la cui unica implementazione, Route,

ammette un URL e un oggetto di tipo IRouteHandler. Nell'esempio riportato di seguito viene

mostrata una semplice definizione sull'indirizzo Sostanze/{ SostanzaID} così da consentire,

nonostante il percorso sul web server non esista, di poter richiamare uno specifico gestore

per tutti gli indirizzi che seguono il percorso Sostanze seguito dall'ID della Sostanza (per

esempio http://miosito.it/Sostanze/1).

Mediante l'uso delle graffe si ha la possibilità di definire dei segnaposti nominali che

vengono poi passati al gestore come parametri così da poter essere consumati per ogni

specifica esigenza. Ogni segnaposto deve essere separato l'uno dall'altro da una costante,

cioè da un qualsiasi carattere valido per le Uri, così da permettere all'interprete di

individuare i valori. Non è valido quindi un percorso come Sostanze/{action}{SostanzaID},

ma lo è invece uno come Sostanze/{actions}-{SostanzaID}.

void Application_Start(object sender, EventArgs e)

{

RouteTable.Routes.Add("SostanzeRoute",

new Route("Sostanze/{SostanzaID}",

new SostanzeRouteHandler()));

}

Per poter attivare il meccanismo di generazione automatica delle pagine occorre

disporre di un modello di dati sottostante. A tale scopo va creato un DataContext a partire

dallo schema contenente i dati da visualizzare e gestire nel sito.

Nel file Global.asax, nell'event-handler dell'evento OnStart dell'applicazione web,

occorre associare il DataContext all'engine Dynamic Data, impostando il parametro

ScaffoldAllTables al valore true se si desidera che le pagine di visualizzazione e gestione dei

dati vengano generate automaticamente per ciascuna tabella mappata nel DataContext.

Nell'event-handler vanno infine definite le eventuali regole aggiuntive di routing valide per

gli URL.

public static void RegisterRoutes(RouteCollection routes)

{

MetaModel model = new MetaModel();

model.RegisterContext(typeof(DB_DipartimentoDataContext), new

ContextConfiguration() { ScaffoldAllTables = true });

routes.Add(new DynamicDataRoute("{table}/ListDetails.aspx") {

Action = PageAction.List,

ViewName = "ListDetails",

Model = model

});

routes.Add(new DynamicDataRoute("{table}/ListDetails.aspx") {

Action = PageAction.Details,

ViewName = "ListDetails",

Model = model

Page 53: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

53

});

}

void Application_Start(object sender, EventArgs e)

{

ContextConfiguration cc = new ContextConfiguration();

// Rendo disponibili tutte le tabelle del DataContext

cc.ScaffoldAllTables = true;

// Registro il DataContext di DB_Dipartimento da utilizzare

model.RegisterContext(typeof(DB_DipartimentoDataContext), cc);

// Registro la tabella di route RegisterRoutes(RouteTable.Routes);

}

A questo punto il gioco è fatto! Nei paragrafi successivi verrà spiegato più in dettaglio la

personalizzazione delle pagine.

Gestione dei dati con dynamic data control

ASP.NET mette a disposizione un buon numero di strumenti e tecnologie per

interrogare, mostrare e modificare i dati. I meccanismi di Databinding consentono di

automatizzare queste operazioni e con il medesimo approccio si possono sfruttare i controlli

data source per popolare controlli come DetailsView o GridView.

Sebbene molto potente come approccio, possa non bastare in certi scenari: occorre

per ogni entità o tabella specificare quali campi mostrare, con quale formato, quali

validazioni compiere, e questa, se l'applicativo è di grosse dimensioni, può diventare

un'operazione molto ripetitiva.

Per semplificare questo scenario, ASP.NET contiene un nuovo assembly di nome

System.Web.DynamicData, che ha lo scopo di rendere più immediate queste operazioni,

automatizzandole in conformità a meta informazioni che si riferiscono a un modello di dati,

che sono mantenuti tramite la classe MetaModel del namespace System.Web.DynamicData.

Questo tipo consente di mantenere una lista di MetaTable, che a loro a volta

contengono una lista di MetaColumn e permettono di conoscere per ogni tabella (da non

considerare solo come tabelle di database, ma anche entità) di quali colonne dispone, se si

possono mostrare, la loro tipologia, se sono obbligatorie, se sono chiavi primarie, la

rispettiva formattazione e la lunghezza massima.

Queste informazioni vengono raccolte a runtime, solitamente all'avvio

dell'applicazione, richiamando il metodo RegisterContext della classe MetaModel e

specificando la tipologia di contesto da analizzare, che può essere un DataContext di LINQ to

SQL piuttosto che un ObjectContext di LINQ to Entities. È comunque possibile passare anche

un oggetto che erediti da DataModelProvider, per supportare qualsiasi tipologia di dato.

Page 54: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

La proprietà ScaffoldAllTables permette di indicare se tutte le tabelle individuate

devono essere visibili (letteralmente vuol dire scaffalate), fatta eccezione per le classi

marcate con l'attributo ScaffoldTableAttribute e avente la proprietà Scaffold impostata su

false.

E’ possibile impostare quest’attributo su un file esterno, mediante le classi parziali.

Tale attributo è contenuto nell'assembly System.ComponentModel.DataAnnotations, perciò

è da considerarsi non strettamente legato ai dynamic data control e utilizzabile anche in

altre circostanze, poiché non impatta sulla pulizia del modello a oggetti.

Nel medesimo namespace, inoltre, l'attributo MetadataTypeAttribute consente di

specificare il tipo da utilizzare per la ricerca delle colonne e dei relativi metadati per una

specifica entità. Poiché queste solitamente definiscono delle proprietà e da esse, è possibile

solo dedurne il tipo occorre ampliare queste informazioni definendo una nuova classe che

presenti campi o proprietà con il medesimo nome dell'entità di riferimento (non importa

quale sia il tipo), le quali sono poi marcati con i vari attributi di annotazioni messe a

disposizioni:

ScaffoldColumnAttribute: permette di includere o meno una colonna tra quelle che

vengono generate automaticamente;

DisplayNameAttribute: definisce il nome della colonna o della tabella da usare per le

intestazioni;

DescriptionAttribute: definisce la descrizione della colonna;

DisplayFormatAttribute: definisce la stringa di formattazione del valore per la lettura

e la scrittura;

DataTypeAttribute: definisce il tipo logico per la colonna. Differisce dal tipo .NET

perché più specifico: ad esempio String può essere un normale testo o un testo

multilinea;

UIHintAttribute: definisce il template grafico da adottare per la riproduzione della

colonna.

Con questa tecnica si possono anche definire i criteri di validazione e variare questi

metadati in funzione del front-end che si utilizza, non intaccando il domain model.

[MetadataTypeAttribute(typeof(ProductMetadata))]

public partial class Product { }

[ScaffoldTable(true)]

public class ProductMetadata

{

[ScaffoldColumn(false)]

public object ProductID;

[DisplayFormat(ApplyFormatInEditMode = false,

DataFormatString = "{0:C}",

NullDisplayText = "vuoto")]

public object UnitPrice;

Page 55: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

55

[DataType(DataType.Currency)]

public object ReorderLevel;

[UIHint("Slider")]

public object UnitsOnOrder;

}

Campi dinamici con DynamicControl e DynamicField

La dichiarazione dei metadati descritta nei paragrafi precedenti ha lo scopo di automatizzare le operazioni di visualizzazione e modifica dei dati: è a questo punto, infatti, che se ne traggono i benefici.

Il controllo DynamicControl permette di mostrare, in fase di Databinding, una

colonna riguardante il contesto dei dati, creando automaticamente l'interfaccia corretta per

il tipo di colonna e per la modalità di visualizzazione.

Il contesto viene ottenuto tramite l'interfaccia IDynamicDataSource, implementata

dalle classi LinqDataSource ed EntityDataSource. Da questo punto in poi il motore recupera i

relativi MetaModel e MetaTable, in base alla tabella che viene impostata.

Sul DynamicControl quindi non resta altro che specificare con la proprietà DataField

la colonna da utilizzare, mentre con quella Mode la modalità di visualizzazione tra quelle

disponibili: ReadOnly (predefinita), Edit, Insert.

DynamicControl utilizza le informazioni contenute su MetaColumn (ottenute dagli

attributi sulle proprietà) per variare le proprie caratteristiche e applicare automaticamente

la codifica HTML (per evitare XSS), la formattazione, le stringhe da utilizzare per i valori nulli

e l'UIHint, dedotta dal tipo di proprietà, dall'attributo DataType o impostato in maniera

specifica tramite l'attributo UIHint.

Generazione automatica delle maschere

Quanto visto nei paragrafi precedenti è il preludio a tutto ciò che serve per ottenere

il risultato finale: generare automaticamente le maschere.

I metadati, infatti, hanno tutte le informazioni per farlo, dato che contengono

informazioni su quali colonne sono visibili, la loro tipologia e formattazione e le intestazioni

da utilizzare. Ciò che si può fare avendo questi dati è omettere la definizione dei campi,

lasciare attiva la normale auto generazione per i controlli GridView o DetailsView e

omettere i DataKeyNames.

Page 56: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

Infine, occorre aggiungere un controllo particolare, di nome DynamicDataManager,

che non emette HTML, ma semplicemente gestisce i controlli di tipo databound, fornendo le

informazioni mancanti.

È, infatti, importante ricordarsi di chiamare il metodo RegisterControl (solitamente

nel Page_Load) passando la griglia o il dettaglio in questione. Questo metodo è in grado di

riconoscere in base all'IDynamicDataSource quale tabella sta caricando, popolando

automaticamente in sua funzione la collezione DataKeyNames con le chiavi primarie e

impostando la proprietà ColumnsGenerator o RowsGenerator, a seconda che sia una

GridView o una DetailsView, con un oggetto IAutoFieldGenerator specifico per i dynamic

data control, che crea le colonne in base ai MetaColumn appartenenti alla MetaTable.

Filtrare le liste dinamiche con i dynamic data control

Nella gestione di database è comune dover ricorrere a filtri da applicare per ricercare

e sfogliare più comodamente le righe. Dato che i controlli LinqDataSource ed

EntityDataSource dispongono della proprietà WhereParameters è teoricamente possibile

eseguire operazioni di filtro. Con tabelle dinamiche, però, non è possibile stabilire a priori

quali colonne filtrare, perciò è stata introdotta una nuova tipologia di Parameter, di nome

DynamicControlParameter, che di fatto non valuta e restituisce i valori ma delega al

DynamicDataManager il compito di sfogliare la collezione WhereParameters degli

IDynamicDataSource, alla ricerca di parametri che implementano l'interfaccia

IWhereParametersProvider, richiamando il metodo GetWhereParameters, ottenendo così

uno o più ControlParameter verso gli effettivi controlli di filtro e rimuovendo il parametro

originale dalla collezione.

La classe DynamicControlParameter ha un'unica proprietà di nome ControlID, che

permette di impostare l'ID del controllo che implementa a sua volta l'interfaccia

IWhereParametersProvider o IControlParameterTarget. La prima è implementata da una

nuova classe chiamata FilterRepeater, una specializzazione di Repeater che carica come lista

di elementi le MetaColumn di tipo ForeignKey o Boolean della MetaTable oggetto della

richiesta. Questo comportamento, peraltro personalizzabile sovrascrivendo il metodo

GetFilteredColumns, permette di definire una zona di filtri, da popolare automaticamente in

funzione della tabella che si sta mostrando. La seconda interfaccia d'altro canto restituisce

l'espressione da utilizzare per recuperare il valore dal controllo di filtro (ad esempio

SelectedValue sulla DropDownList), così da impostarla sui ControlParameter generati in

automatico.

Ogni riga infatti deve contenere un controllo con ID DynamicFilter (o quello

impostato con la proprietà DynamicFilterContainerId sul controllo FilterRepeater), che a sua

volta deve implementare l'interfaccia IControlParameterTarget, la cui unica

Page 57: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

57

implementazione è rappresentata dal tipo FilterUserControlBase, un UserControl da

personalizzare che rappresenta il filtro di ogni MetaColumn.

Conclusioni

Il routing è uno strumento semplice, ma che permetta al tempo stesso nuovi scenari

di dinamicità delle pagine, mentre i dynamic data control consentono di generare

facilmente maschere di visualizzazione e modifica orientate alle tabelle, ma allo stesso

tempo concedono di personalizzare molti i loro aspetti.

Inoltre, viene facilitato ancor di più il compito con due tipologie di applicazioni web

basate sui dynamic data control che preparano automaticamente le cartelle con i predefiniti

FieldTemplate e PageTemplate.

4.4.2 ASP.NET AJAX

Il mondo dell'IT è dominato dalle regole del mercato. Seguendo questa legge, è facile

immaginare che ci siano momenti in cui alcune tecniche vanno per la maggiore. Questo è

notevolmente il momento in cui AJAX va per la maggiore.

Uno dei pilastri dell'era del Web 2.0 è AJAX: il mix di tecnologie che ha dato nuova

linfa alle applicazioni online. Naturalmente anche il mondo ASP.NET ne è influenzato, lo

dimostrano i diversi framework nati per supportare questa filosofia di sviluppo; in prima fila

la libreria JQuery16 con la filosofia “Write less, do more”.

Microsoft, dal canto suo, non poteva esimersi dall'implementare uno strumento

"ufficiale" e, a inizio 2006, inizia il progetto di un framework AJAX da poter interfacciare con

ASP.NET. Il nome in codice ATLAS ha accompagnato tutte le release di sviluppo, ma dalla

prima versione stabile il framework prende il nome di ASP.NET AJAX17.

Perché AJAX

Prima di passare al discorso tecnico, è bene spendere un po’ di tempo per capire

perché si ha bisogno di AJAX nelle applicazioni web di oggi e in quelle del futuro. Quando si

deve sviluppare una nuova applicazione, ci si trova davanti ad una scelta: crearne una

Desktop o una Web.

16

http://jquery.com/ 17

http://www.asp.net/ajax

Page 58: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

Le applicazioni desktop sono le classiche applicazioni Windows, mentre quelle web

sono quelle a cui si può accedere tramite browser. Le prime hanno il pregio di essere

performanti, siccome girano sulla macchina che le esegue, di offrire un gran livello di

interazione e di essere tendenzialmente più semplici da realizzare. Per contro, queste

applicazioni devono essere installate su ogni macchina con conseguenti problemi di

aggiornamento e manutenzione.

Le applicazioni web superano gli svantaggi di distribuzione da cui sono affette quelle

stand alone(aka desktop) perché devono essere distribuite solo sul server che le esegue, ma

per contro hanno una maggior difficoltà di realizzazione e, soprattutto, un livello di

interazione inferiore rispetto alla controparte. Mentre per le applicazioni desktop il

problema della distribuzione è invalicabile (eccetto che non si tratta di RIA), per quelle web

il problema della lentezza e della bassa interattività può essere risolto. Infatti, al classico

modello richiesta del browser => risposta del server, si può passare a un meccanismo di

richiesta => risposta con il trasporto dei soli dati. Il tutto senza eseguire il refresh completo

della pagina e il conseguente miglioramento dell'usabilità e delle performance. Tutto questo

può accadere grazie all'approccio AJAX.

La logica di funzionamento

La logica comune a tutti i Framework realizzati per AJAX prevede che non vi sia più la

necessità di eseguire dei PostBack della pagina per inviare le richieste al server. Basta inviare

o richiedere le informazioni tramite JavaScript, quindi dai Client.

Le diverse soluzioni sono in grado di realizzare a run-time, quindi durante

l'esecuzione e la creazione della pagina stessa, una sorta di "Proxy", in altre parole un

interprete nascosto che riceve la richiesta dal client, la elabora, attende il risultato e lo

reinvia alla pagina, senza bloccarla durante la fase di attesa.

Figura 18: La struttura di un'applicazione AJAX-enabled

La figura accanto mostra come

avviene una richiesta Server-Side da parte

di un’applicazione basata su AJAX. Viene

effettuata una richiesta al server, che la

elabora prelevando i dati da un database.

I dati risultanti vengono restituiti sotto

forma di file XML che può essere

interpretato e letto direttamente dal

client con opportune routine JavaScript

presenti nella pagina. Come effetto finale

evitiamo il ricaricamento della pagina

stessa.

Page 59: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

59

E’ facile immaginare i campi dove AJAX può tornare utile. Ad esempio, si può

paginare e ordinare una griglia, lanciare operazioni sul server a intervalli regolari (Polling),

creare funzioni di Master-Detail, ecc.

A base di tutta la tecnica AJAX rimane sempre la possibilità di colloquiare in

asincrono e senza postback con il server. Il resto non è altro che codice javascript che

interpreta dati inviati dal server, quindi niente di realmente nuovo o rivoluzionario.

4.4.3 Le funzionalità principali

La pagina principale, chiamata Default.aspx (ovvero l’home page del sito), racchiude

in sé il menu nella sua sinistra e un frame per visualizzare tutte le altre pagine che un’utente

vuole aprire nella sua destra. I link mostrati dal menù cambiano dinamicamente in relazione

all'autorizzazione del singolo utente.

Ci sono quattro tipi di utenti previsti: l’utente sconosciuto o “chiunque”, l’operatore

di laboratorio, l’operatore della gestione degli ordini e l’amministratore (ovviamente, si

potrebbero aggiungere altri tipi di utenza per ogni successiva necessità richiesta). Ogni

utente ha accesso all'archivio delle frasi di rischio e sicurezza.

All'apertura dell'applicazione l'utente ha a disposizione il link di consultazione delle

frasi di rischio e sicurezza e il link di reindirizzamento nella sezione di Login/Register.

Figura 19: Home Page

L’elenco delle sostanze chimiche

Questa pagina è dunque accessibile a chiunque nella quale c'è l'elenco di tutte le

sostanze chimiche inserite nel database. Per ogni sostanza sono associate varie informazioni

aggiuntive. Inoltre è possibile filtrare la ricerca inserendo negli appositi posti di ricerca vari

criteri.

Page 60: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

Figura 20: Elenco delle sostanze chimiche con le relative frasi di R/S

Figura 21: Un esempio di una pagina con i dettagli concernenti una particolare frase di rischio

Per ogni sostanza vengono

elencate tutte le frasi di rischio e

sicurezza. Come si vede, sono hyperlink

che puntano a una pagina di una frase

specifica. Come esempio è mostrato la

frase rischio R21.

Login / Registrazione

Per identificare e differenziare gli utenti, si rende necessario un meccanismo di

autenticazione e autorizzazione. L'autenticazione è il processo mediante il quale si

ottengono le credenziali dell'utente collegato, quali nome e password; credenziali che

verranno poi validate per il riconoscimento dell'utente e associarlo i ruoli appartenenti.

Inoltre, è stato sviluppato un modulo di registrazione per i nuovi utenti. Dopo la fase

di registrazione si deve aspettare l’attivazione dei ruoli da parte dell’amministratore.

Prelievo / Restituzione

Pagina Prelievo

Descrizione: La pagina contiene l'elenco di tutti i reagenti attualmente disponibili al

prelievo.

Page 61: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

61

Precondizione: utente autorizzato (operatore di laboratorio o amministratore)

Funzionalità accessibili:

visualizzazione di tutti i reagenti disponibili al prestito, divisi per sostanza chimica

prelievo di un reagente:

1. (opzionale) filtrare la lista delle sostanze chimiche in base ad una stringa

2. selezionare la sostanza chimica desiderata dalla lista delle sostanze chimiche

3. selezionare il reagente (contenitore) desiderato dalla lista dei reagenti

attualmente disponibili

4. l'utente deve specificare (negli appositi spazi) la quantità che desidera

prelevare e dove riporrà il contenitore scelto

Figura 22: La pagina del prelievo di un reagente

Pagina Restituzione

Descrizione: La pagina contiene una tabella di tutti i reagenti attualmente in prestito

dall'utente. In essa l'utente può restituire un reagente (contenitore).

Precondizione: utente autorizzato (operatore del laboratorio o amministratore)

Funzionalità accessibili:

Page 62: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

• visualizzazione di tutti i reagenti in prestito dell'utente, divisi per sostanza chimica

• restituzione reagente:

1. selezionare il reagente (contenitore) desiderato dalla tabella dei reagenti

attualmente in prestito dall'utente

2. l'utente deve specificare dove riporrà o l’ha già riposto il contenitore scelto

Figura 23: La pagina della restituzione di un reagente

Nuovo Ordine / Archivio Ordini

Nuovo Ordine

Descrizione: La pagina contiene un wizard per portare a termine un nuovo ordine.

Precondizione: utente autorizzato (operatore di gestione ordini o amministratore)

Funzionalità accessibili:

Lo scopo di questo modulo è di fornire un’interfaccia user-friendly per facilitare

l’elaborazione del documento dell’ordine e in particolar modo utilizzando una base di dati

per l’archiviazione degli ordinativi. Mediante una procedura inglobata in un’applicazione più

complessa, che permette all'utente di eseguire determinate operazioni tramite una serie di

passi successivi, si prepara il documento riguardante l’ordine. Il documento da elaborare

consisterà in un riepilogo dei dati dell’ordine, in particolar modo l’intestazione del fornitore,

l’elenco dei prodotti da ordinare e altri dati come ad esempio le date di ordine e offerta ecc.

Il primo passo consiste nel riempire i campi che si riferiscono al numero ordine (che

viene suggerito in automatico, che però è modificabile), la data dell’ordine data e/o numero

di offerta (se c’è stata un’offerta), la fattura se richiesta e l’anno dell’esercizio. Quest’ultimo

rappresenta l’anno finanziario corrente, utile per inserire l’ordine all’interno del bilancio

Page 63: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

63

annuale. È un campo automatico, anche se potrà essere modificato al momento

dell’inserimento dell’ordine con valori a piacere. In caso di attività commerciali va posto a

fianco del numero dell’ordine (calcolato in automatico ma con possibilità di modifica) la sigla

“LE”, per l’identificazione all’interno del SAP. Per le attività istituzionali é omessa la sigla

“DE” che viene sottointesa.

Figura 24: Nuovo ordine, primo passo

Nel secondo passo sono scelte le estremità: il dipendente in automatico (l’utente

autenticato nel sistema) mentre il fornitore da una lista.

Figura 25: Nuovo ordine, secondo passo

Page 64: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

Nel terzo passo bisogna scegliere tra il CDC e Commessa. La commessa è un codice

alfanumerico di otto cifre, scelto arbitrariamente dall’utente per descrivere il tipo di

commessa (utilizzato soprattutto per acquisti per dei fondi di ricerca). Il campo relativo al

centro di costo è alternativo alla commessa e si utilizza in caso di acquisti che interessano

l’intero dipartimento. Vi saranno vari codici per mappare i vari centri di costo (ad esempio

120110 rappresenta un ordine per il dipartimento in generale).

Figura 26: Nuovo ordine, terzo passo

Andando avanti, si compila la lista dei prodotti, scegliendo l’opportuna IVA relativa al

tipo d’acquisto: devono comparire le quantità e le descrizioni delle merci, nonché i prezzi

unitari e l’IVA da applicare all’ordine. Non risulta necessario avere una tabella relativa ai

prodotti, in quanto questi non si ripetono così frequentemente. Particolare attenzione va

prestata all’IVA. Vi sono tre casi possibili: il più frequente è quello in cui il preventivo è

inteso senza IVA. Nell’ordine andrà aggiunta quindi il 20% di IVA. Vi è il caso poi in cui i

preventivi sono già ivati, quindi non è necessario aggiungerla al prezzo del preventivo e

infine si può presentare il caso in cui i preventivi sono senza IVA poiché i prodotti richiesti ne

sono esenti. Proprio in quest’ultimo caso sarà necessario prevedere la possibilità di

escludere dal resoconto dell’ordine sia il codice fiscale sia la partita IVA del dipartimento, in

modo da far capire al fornitore che l’IVA è a suo carico.

Page 65: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

65

Figura 27: Nuovo ordine, quarto passo

Il quinto (e l’ultimo) passo offre la possibilità di mandare una coppia dell’ordine al

fornitore tramite mail (il documento preparato sarà spedito come allegato) e stampare

(anteprima stampa) dall’operatore degli ordini.

Figura 28: Nuovo ordine, quinto e l'ultimo passo

Premendo il bottone ‘Esegui Ordine’ viene salvata una coppia del documento in pdf e

una in excel nella cartella prespecificata, oltre al salvataggio sul database.

Page 66: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

Archivio Ordini

Descrizione: La pagina contiene una griglia con l’elenco di tutti gli ordini effettuati

con i relativi dettagli, offrendo anche la possibilità di modificare ognuno.

Precondizione: utente autorizzato (operatore di gestione ordini o amministratore.)

Funzionalità accessibili:

Una volta compilato l’ordine questo va salvato in archivio con possibilità di essere

ripreso per visualizzarlo o per modificarlo. E’ possibile interrogare l’archivio sotto vari

parametri. Inoltre è previsto anche un flag per ogni ordine relativo al ricevimento della

relativa fattura.

Figura 29: Archivio degli ordini

Gestione e configurazione

Descrizione: Una raccolta delle pagine di amministrazione del sito

Precondizione: l’utente dev’essere amministratore.

Funzionalità accessibili:

Page 67: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

67

Questa sezione contiene una lista delle pagine che offrono la possibilità delle

operazioni di creare, modificare o cancellare le sostanze, i reagenti, gli ordini, gli utenti, i

fornitori e gli scarti. Infine, nella pagina di Scaffolding c’è l’elenco di tutte le tabelle di

database offrendo la possibilità di intervenire direttamente sul database da parte

dell’amministratore (un valore aggiunto del sito, tutto realizzato con l’aiuto di Dynamic Data

Controls analizzato più sopra).

Figura 30: Lo spazio dedicato all'amministratore del sistema.

La tabella più importante nella pagina Scaffolding è sicuramente ‘tblMaster’. È stata

creata per contenere informazioni riguardanti l’applicativo e permettere il corretto

funzionamento. Essa è costituita da un unico record contenente numerosi campi

eterogenei. Sarà cura dell’amministratore compilare correttamente i campi per un

funzionamento corretto del sito.

Page 68: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

Conclusioni

llo stato attuale è possibile affermare che gli obiettivi prefissati sono stati

raggiunti. Sono stati soddisfatti i requisiti focali che erano stati individuati

attraverso l’analisi, ovvero la realizzazione di un sistema informativo per

integrare tutte le soluzioni informatiche alle problematiche delle attività indispensabili che

riguardano un dipartimento universitario che:

Sia accessibile a chiunque semplicemente collegandosi a internet e utilizzando il

browser.

Permetta agli operatori dei laboratori di prelevare e restituire le sostanze chimiche

senza la necessità di compilare moduli cartacei.

Classifichi i dati su database in modo che essi siano gestibili per operazioni eventuali

su di essi (ad esempio consultazione del catalogo delle sostanze e le relative frasi di

rischio e/o sicurezza, statistiche che riguardano gli ordini, etc.).

Permetta alla segreteria (o all’operatore di ordini) la gestione e la consultazione

dell’archivio degli ordini e la compilazione in modo più semplice e rapido del

documento necessario alla richiesta delle merci o dei servizi tramite un modulo

apposito.

Manca ancora l’installazione dell'applicazione nel web server e lo spostamento della

base di dati nel DBMS del dipartimento. Dopo una fase di test e collaudo assieme

all’importazione dei dati reali del magazzino, ci sia la possibilità di un immediato utilizzo del

sistema.

Ovviamente il progetto non può considerarsi terminato poiché, come sempre accade

nell’informatica, le possibilità di perfezionamento ed evoluzione sono pressoché infinite.

Oltre a questo, le necessità del dipartimento possono cambiare e/o incrementare con il

passare del tempo. Per questo motivo la progettazione è stata pensata a un sistema

facilmente scalabile e suddiviso in moduli, ognuno dei quali svolge precise funzioni e

distribuiti in maniera tale di intervenire velocemente nella fase di manutenzione.

Sviluppi futuri potranno tenere conto di parametri non considerati in questa tesi, per

migliorare le prestazioni e altri ambiti desiderati. Le possibili evoluzioni del progetto sono

numerose e riguardano vari aspetti. Per citarne qualcuna:

Account utenti

Se questo applicativo dovesse essere utilizzato solo nell’ambito dell’ateneo, sarebbe

opportuno poterlo interfacciare al sistema di gestione degli utenti, che è basato su Active

A

Page 69: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

69

Directory; per l’integrazione si utilizzano le API del modello ADSI (Active Directory Service

Interfaces). Nel prototipo non si è ritenuto opportuno farlo per non appesantire

eccessivamente il sistema in fase di test, durante la quale tutte le parti del progetto sono in

esecuzione sullo stesso calcolatore.

In alternativa, l’uso dei protocolli crittografici (SSL o TLS) nella fase di autenticazione

è consigliabile permettendo una comunicazione sicura e un’integrità dei dati. In questo

momento il sistema supporta il protocollo SSL, però bisogna specificare esplicitamente

[Requires SSL] nella logica applicativa.

Firma Digitale

Per rendere il modulo della gestione degli ordini veramente efficiente sarebbe

auspicabile implementare l’algoritmo di firma digitale ai documenti d’ordine inviati ai

fornitori, in modo da dare al documento elettronico ottenuto la validità legale. Pur essendo

presente nell’ateneo un’infrastruttura adatta a questo scopo, non è stato previsto

nell’inserirlo questo dettaglio.

Page 70: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

Appendice 1 - Come aggiungere un’altra funzionalità

uest’appendice contiene i passi da seguire per aggiungere altre funzionalità

nel sistema. I requisiti software sono: .NET Framework 4.0, Visual Studio

2010, WCF RIA Services Toolkit, Ajax Extentions e AjaxControlToolkit (le ultime due

non sono obbligatorie, ma consigliabile per aumentare l’User eXperience). Innanzitutto si deve

aggiornare prima la struttura fisica dei dati mettendo nel database del sito le nuove tabelle,

viste, stored procedures, triggers e tutto il resto che riguarda i dati. Dopodiché possiamo

iniziare il lavoro aprendo il progetto con il Visual Studio.

1. Si aggiorna il modello dei dati. Doppio click sul file Model.edmx Viene aperto il

diagramma con tutte le classi che sono mappate con le tabelle del database.

Cliccando con il destro del mouse dentro il diagramma si apre un menù con vari

comandi. Scegliamo ‘Update Model From Database’.

Nella finestra successiva che viene aperta,

possiamo scegliere se aggiungere,

aggiornare o cancellare tabelle, viste o

stored procedure.

Q

Page 71: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

71

2. Creare una cartella nuova. Creiamo una cartella nuova (a.e. _MyNewFolder). In essa

saranno piazzate le pagine della nuova funzionalità desiderata. Per il momento ci

limitiamo solo sulla creazione di una pagina di default.

Click con il destro del mouse sopra

la cartella appena creata -> Add ->

New Item. Nella finestra scegliamo

fra i modelli il ‘Web Form Using

MasterPage’, assegniamo il nome

Default.aspx, poi premiamo il

pulsante Add. Nella finestra

successiva scegliamo il master

page (quella che esiste

‘Site.master’ o un’altra) e poi ->OK.

Il risultato è mostrato nella figura

accanto.

Apriamo la pagina appena creata nella modalità design e trasciniamo dentro il controllo

‘SectionLevelListing.ascx’ che si trova in ‘DynamicData- EntityTemplates’.

Questo controllo servirà come un menù basata nella mappa del sito(lo vedremo in

avanti come crearla) per le pagine che saranno messe dentro questa cartella.

3. Proteggere la cartella dagli utenti non autorizzati. Apriamo il file ‘web.config’ e

dentro la voce <configuration> inseriamo la configurazione per la nostra cartella:

<location path="_MyNewFolder">

<system.web>

<authorization>

<allow roles="Admin,Utente,Dipendente" />

<allow users="ledio"/>

<deny users="*" />

</authorization>

</system.web>

</location>

Page 72: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

Dal server web questa configurazione viene tradotta come: proteggi questo realm

che si trova nella cartella ‘_MyNewFolder’. Sono autorizzati a vedere i contenuti di

questa cartella i seguenti gruppi "Admin,Utente,Dipendente" e utenti "ledio", tutti

gli altri (deny users="*") non hanno accesso. (ovviamente i gruppi e gli utenti sono

modificabili alla necessità)

4. Routing. Nel caso che volessimo usare i DynamicData possiamo configurare

l’instradamento delle richieste con il controllo di routing che si trova nel file

Global.asax dentro la funzione

public static void RegisterRoutes(RouteCollection routes) { }

Un semplice esempio è il seguente codice per tblSostanzaChimica:

routes.Add(new DynamicDataRoute("Admin/SostanzaChimica/{action}.aspx")

{

Constraints = new RouteValueDictionary(new { action =

"List|Details|Edit|Insert" }),

Model = DefaultModel,

Table = "tblSostanzaChimica"

});

L’URL creato è ovviamente virtuale e, come si vede che esiste sotto la cartella Admin,

viene protetta grazie alla procedura spiegata al punto 3.

5. Sitemap. La mappa del sito è uno strumento molto utile nel caso di un sito web con

numerose pagine. Inoltre, essendo un file XML formattata in modo particolare, può

essere sfruttato come DataSource per creare menù di navigazione di stile treeview,

breadcrumb o custom. Un semplice esempio è mostrato in seguito:

<?xml version="1.0" encoding="utf-8" ?>

<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >

<siteMapNode url="~/Default.aspx" title="Home" description="Home" roles="*">

<siteMapNode url="~/_MyNewFolder/Default.aspx" title="La nuova funzionalità"

description=" La nuova funzionalità " roles=" Admin,Utente,Dipendente" >

<siteMapNode url="~/_MyNewFolder/UnaPagina.aspx" title=" UnaPagina"

description=" UnaPagina" roles="Admin,Dipendente" />

<siteMapNode url="~/_MyNewFolder/ UnaPagina2.aspx" title=" UnaPagina2"

description=" UnaPagina2" roles="Admin, Utente" />

</siteMapNode>

</siteMapNode>

</siteMap>

Quindi si conserva la gerarchia del tipo :

Page 73: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

73

<siteMapNode url="" title="" description="" />

6. DomainService La logica dell’applicazione viene piazzata dentro questo pattern. Per

creare una nuova logica per la nostra funzionalità si seguono questi passi: Click con la

destra sopra la cartella ‘DomainServices’-> Add ->New Item. Scegliamo dall’elenco

‘Domain Service Class’; attribuiamo un nome (a.e. MyNewFeatureDS.cs). Nella

finestra successiva scegliamo la fonte di dati (in questo caso

‘DB_DipartimentoEntities’), selezioniamo gli oggetti che faranno parte nella logica e

se vogliamo anche la scelta di modifica di essi.

Premendo ‘OK’ sarà generato lo scheletro della nuova classe di BusinessLogic della

nostra funzionalità ed è pronta per usarla o modificarla. In essa possiamo piazzare

oltre alle operazioni di CRUD e logica funzionale, anche validazione, autenticazione

autorizzazione, richiesta di SSL gestione degli errori, etc. Il punto di forza di questa

Page 74: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

pattern è l’indipendenza dalla fonte e UI, quindi è facilmente testabile con moduli

UnitTest!

7. Services. Nel caso della necessità di servizi web (consumare o esporre), è stata creata

la cartella ‘Service’ come contenitore, fornendo anche di un semplice esempio di

autocomplete sia nella versione standard POX (Plain Old XML) sia nella versione

WCF.

8. Pages. Questo rappresenterà lo stato d’arte del web designer. Le pagine della

funzionalità dovranno stare dentro la cartella creata nel punto 2. possono utilizzare

dati provenienti dai fonti descritti nei punti 6. & 7. e la logica del DomainService (6.).

Opzionale potrebbe essere l’uso di AJAX, MVC e perfino Silverlight (essendo la logica

incapsulata nella DomainService, questo pattern non distingue tra le applicazioni

web asp.net e quelle RIA Silverlight).

Happy Programming!

Page 75: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

75

Ringraziamenti

e non avessi avuto un debito da onorare, e una promessa da mantenere, in

assoluto le singole persone che più di ogni altre avrebbero meritato che

questo lavoro fosse loro dedicato sono certamente i miei genitori e il mio

fratello, cui pure lo dedico per aver aspettato e sopportato così a lungo. Ad essi vanno tutta

la mia stima, il mio rispetto e la mia riconoscenza per il sostegno ed il grande aiuto che mi

hanno dato.

*** *** *** ***

Desidero innanzitutto ringraziare il Professor Maurizio Fermeglia per i preziosi

insegnamenti, per avermi accolto come tesista e indirizzato sempre verso la strada giusta da

intraprendere, e per le numerose ore dedicate alla mia tesi. Inoltre, ringrazio sentitamente il

Professore Alberto Bartoli, un professore ed un amico contemporaneamente. Un saluto va

anche agli altri professori. Non elenco tutti uno per uno perché la lista sarebbe un po’ lunga.

Vorrei ringraziare i miei più stretti amici (scusatemi per l’ordine ed eventuali

involontarie omissioni): Ermal, Deinis ‘Rreku’ & Denis ‘Penis’, Genti ‘Geçe’ , Sai ‘Ricky’, Klajdi

‘KlaKla’, Herald ‘Pislleku’, Ani i Lames, Flor çami, Edjon ‘xhaxhi Edi’; Tati, Mikel, Zak, Eris

Mashtruesi, Jonka, i cugini Hasa, chef Kristi.

S

Page 76: Progetto e realizzazione di un software in ambiente Web per l’integrazione di applicazioni basato su WCF

Bibliografia

J.D. Meier, A. H. (2008) - Web Application Architecture Pocket Guide. Microsoft Corporation.

Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides (1995) - Design Patterns:

Elements of Reusable Object-Oriented Software

Martin Fowler (2002) - Patterns of Enterprise Application Architecture

Samo Ziberna - Progetto e sviluppo di un’applicazione per la gestione di un reagentario

Daniele De Gan - Sviluppo di un’applicativo in .NET per la gestione degli ordini ai fornitori di

un dipartimento universitario.

Giovanni Puliti (2010) - Dalle applicazioni web alle RIA, Evoluzione dal modello a pagine alla

Single Page Interface

M. Piraccini, S. Rossini (2006) - Architetture d’Integrazione

Cristian Civera (2008) – Routing e Dynamic Data Control

The Microsoft Developer Network (MSDN)