Per realizzare un'applicazione gestionale, o Line-Of-Business (LOB), contenendone i costi di sviluppo e quindi i prezzi di vendita, è necessario partire dal renderla utilizzabile in diverse realtà, facilmente ampliabile e personalizzabile nelle funzionalità che mette a disposizione.

Un esempio può essere un gestionale di contabilità, in cui è presenta una struttura base comune a tutti i settori dell'azienda, ma vi sono anche alcuni aspetti specifici per la vendita, il magazzino e l'amministrazione:

  • l'anagrafica dei clienti e dei prodotti è comune a tutti gli utenti;
  • il venditore visualizza tipo e prezzi dei prodotti e può inserire nuovi clienti;
  • il magazziniere visualizza i dati e i prodotti dell'ordine da evadere;
  • l'impiegato visualizza i prodotti preparati dal magazziniere in base all'ordine e i dati del cliente per emettere la bolla/fattura.

Supponiamo che, in seguito, il cliente chieda di aggiungere nuove funzionalità, come la giacenza in magazzino per il venditore o la tracciabilità dei lotti.
Con un'applicazione monolitica, potrebbe essere necessaria la riscrittura di molte porzioni di codice, mentre in un'applicazione modulare, modificando uno o più moduli o aggiungendone di nuovi, è possibile soddisfare le richieste di un singolo cliente: sarebbe possibile ampliare, ad esempio, i settori in cui il gestionale può essere impiegato, allargando la clientela potenziale.

Perché utilizzare Prism

Per ottenere la modularità abbiamo a disposizione varie soluzioni, alcune incluse nel .NET Framework, altre di terze parti. Possiamo anche creare una nostra libreria di classi, che svolga questa funzione. A tale scopo, Microsoft ci mette a disposizione due framework: Prism e MEF.

Prism o Composite Application Guidance for WPF and Silverlight (come veniva chiamato nelle precedente versioni) è scaricabile da questa pagina. Dalla nuova release 4 supporta MEF, MVVM e Windows Phone 7. Si tratta di un framework che ha l'obiettivo di facilitare il lavoro degli architetti e degli sviluppatori, per realizzare applicazioni moderne, con grafica accattivante e codice di facile manutenzione, utilizzando la UI Composition in combinazione con i più diffusi pattern di programmazione, tra i quali MVVM. Oltre alla classica suddivisione in layer, è possibile suddividere l'applicazione in moduli, ospitati localmente o su server remoti, la cui evoluzione e testabilità possono essere indipendenti da quella dell'applicazione.

A prima vista, il suo funzionamento sembra più complicato di quanto non lo sia in realtà. Come tutti i pattern bisogna prima capirne i principi e gli scopi per cui è stato pensato, poi passare alla sua applicazione. La documentazione, rigorosamente in inglese, fornita insieme agli assembly è completa, di facile consultazione, e guida nell'apprendimento, con diversi progetti di esempio per le varie funzionalità offerte. Con alcune piccole accortezze, il codice può funzionare sia con WPF, sia con Silverlight.

Che cos'è Prism

La figura che segue mostra la divisione dell'interfaccia utente in più Regions, racchiuse nella Shell, che in WPF è la MainWindow, mentre in Silverlight è il Root UserControl.

Una Region può essere un ContentControl o qualsiasi altro controllo in grado di contenere più Items allo stesso tempo, come per esempio TabControl, ListBox o RibbonMenu

Ogni Region, in base al controllo utilizzato, può contenere una o più View, che a loro volta possono essere UserControl, controlli o gruppi di controlli, come, ad esempio, una Tab per un TabControl. La gestione dell'associazione di Region e View è affidata al RegionManager.

La Shell tiene insieme la parte grafica, ma il cuore vero e proprio di Prism risiede nella classe Bootstrapper, che ha il compito di inizializzare, registrare e configurare le parti dell'applicazione.

Prism consente l'indipendenza tra le varie parti dell'applicazione, sfruttando un Dependency Injection (D.I.) Container per la gestione delle dipendenze, ma offre anche la possibilità di dividerla in Modules, che possono essere caricati in automatico all'avvio, oppure all'occorrenza, quando l'utente accede a determinate sezioni dell'applicazione, indipendentemente se si trovano nel file system locale o su un server remoto, ottenendo un risultato analogo all'utilizzo della cache del browser ed a quanto offerto dalla funzione "Reduce XAP Size" di Silverlight.

La classe Boostrapper è astratta e va implementata in base al D.I. Container scelto, in quanto Prism non ci obbliga ad utilizzarne uno specifico. Per questo, potete optare per quello che preferite, ad esempio Unity, Castle, Spring.net o Ninject.

Nella libreria sono incluse due implementazioni specifiche per i prodotti di casa Microsoft: la prima, che è presente fin dalle precedenti versioni, si chiama UnityBootstrapper e, come il nome suggerisce, consente di utilizzare Unity, mentre dalla v4 è stata aggiunta la classe MefBootstrapper, per utilizzare MEF. Quest'ultima non rispetta in pieno il pattern dell'Inversion of Control, ma offre alcune funzionalità analoghe, che consentono il suo utilizzo come D.I. Container anche in un'applicazione con Prism. È comunque possibile eseguire l'override dei metodi virtuali, creando una propria classe bootstrapper, come vedrete più avanti con il progetto di esempio.

MEF o Manager Extensible Framework, è nato come progetto di un team di Microsoft esterno al .NET Framework, ma è stato successivamente incluso nel .NET Framework 4.
È utilizzabile referenziando l'assembly System.ComponentModel.Composition e ha l'obiettivo di semplificare lo sviluppo di applicazioni estendibili e modulari. Si va ad affiancare al Manager Addin Framework (MAF), che fa riferimento all'assembly System.AddIn introdotto nel .NET framework 3.5, ma con finalità differenti.

Per fare un esempio, pensiamo al gioco Tetris un po' semplificato, in cui il giocatore è MEF e può cercare all'interno del Catalog il pezzetto che gli serve per completare l'applicazione, chiamato ComposablePart, che in base agli attributi con cui è decorata, può offrire (Export) o importare (Import) dei contenuti, o entrambi.
L'immagine che segue chiarisce meglio il concetto.

5 pagine in totale: 1 2 3 4 5

Attenzione: Questo articolo contiene un allegato.

Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

Realizzare applicazioni modulari con Prism e MEF 610 9
| Condividi su: Twitter, Facebook, LinkedIn, Google+

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti