i plugin mef
Post on 27-Jul-2015
165 Views
Preview:
TRANSCRIPT
Da IPlugin a MEF: costruire applicazioni estendibili
Leo Alario
http://dotnetside.org/blogs/leohttp://twitter.com/leo_alario
L’estendibilità nei sistemi software
Nuove esigenze negli scenari del softwareo Crescenti esigenze
o Mutevoli esigenze
Quali sono le aspettative di un cliente da un sistema software?
o Soddisfazione dei suoi requisiti
o Riduzione degli errori
o Sicurezza
o Facilità d’uso
o Affidabilità
o Disponibilità
L’estendibilità nei sistemi softwareCome ci adeguiamo al cambiamento? o Utilizzando tecniche e metodologie di sviluppo softwareo Utilizzando strumenti di lavoro più produttivio Utilizzando metodologie agili, introdotte per rispondere velocemente ad un rapido cambiamento e/o evoluzione dei requisitio Utilizzando tecniche di Test Driven Development che ci consentono di preservare la qualità del codice e prevenire potenziali problemi quando ne aggiungiamo del nuovoo Applicando la Continuous Integration, che ci mette quasi al sicuro da spiacevoli sorprese
L’estendibilità nei sistemi softwareMa tutto questo comporta un costo …o Frequenti modifiche del codice sorgente
o Frequenti compilazioni e successivi rilasci, con tutto ciò che ne consegue
o Aumento delle probabilità di introdurre bug
o Aumento delle probabilità di variare, in modo errato, la logica o l’interfaccia grafica di un sistema software già esistente e consolidato
Altre aspettativeo Sistema Software facilmente customizzabile dal team di sviluppo
dello stesso o da terze parti
L’estendibilità nei sistemi softwareInoltre …Dobbiamo confrontarci con il vecchio problema del ciclo di vita di un software
Sviluppo
Manutenzione80%
20%
La soluzione?
Extensibility
L’estendibilità nei sistemi softwareChe cosa è l'estendibilità?o E’ un insieme di concetti, tecniche, e meccanismi che consentono di realizzare software estendibile senza ‘’toccare’’ il
codice originale
o Nell’ambito dell’ingegneria del software è un insieme di tecniche concernenti l’architettura e il design del software.
o Nell’ambito dei linguaggi di programmazione è un insieme di meccanismi e concetti che rendono semplice rendere estendibile un software
L’estendibilità nei sistemi softwareQuali sono i vantaggi dell'estendibilità?o Consente di estendere il software senza modificare il sorgenteo Fornisce agli utenti e agli sviluppatori un mezzo semplice per espandere il softwareo Semplifica la vita in ambito compilazione e distribuzioneo Facilita il debug e l’eventuale rimozione di estensioni in caso di problemio Rende possibile ad altri sviluppatori di estendere un software esistente
L’estendibilità nei sistemi softwareCome è possibile rendere estendibile un software?o E’ possibile rendere un software estendibile utilizzando i concetti dell’
OOP. L’estendibilità si basa essenzialmente su Abstraction e Reflection, classi base astratte e/o interfacce sono usate frequentemente
Un po’ di storiao Il primo software estendibile della storia è nato nel 1970, stiamo parlando di un editor di testo EDT in
esecuzione sul sistema operativo Unisys VS/9 su computer Univac serie 90/60
o Nel 1987 Ed Bomke ha coniato il termine plug-in, riferendosi al software da lui sviluppato, Digital Darkroom, primo programma Macintosh a supportare l’estendibilità
Extensibility in action
o Possiamo procedere in modo artigianale utilizzando i concetti dell’OOP
o Utilizzare il Managed AddIn Framework, aka System.AddIn, per gestire add-ins, add-ons, plug-ins, e extensions, introdotto con il .Net framework 3.5
o Utilizzare il Managed Extensibility Framework introdotto con il .Net framework 4.0
Strumenti disponibili per il .NET framework
Da allora ne è passata di acqua sotto i ponti
MAF in actionSystem.Addin è una tecnologia ideale per affrontare questioni relative al versionamento, l'isolamento e la recuperabilità dei componenti aggiuntivi
System.Addin ci permette di "hostare" diverse componenti in app domains separati, consentendo così agli addin di avere diverse versioni di assembly che "girano" nello stesso processo.
System.Addin gestisce automaticamente il rilascio di app domains che non sono più utilizzati, consentendo di recuperare la memoria.
Con System.Addin gli addin sono eseguiti in una sandbox per garantire che i componenti che vengono caricati non abbiano accesso non autorizzato ai dati nel resto del applicazione
System.AddIn, grazie all'isolamento, consente all'applicazione di non “crashare” se uno degli addins dovesse “crashare”a sua volta
Caratteristiche salienti di MAF
MEF in actionIspirato dall’open/closed principle“Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification” Formulato da Bertrand Meyer nel suo libro Object-Oriented Software Construction (1988).
Un'applicazione può essere creata da parti, componibili.
Il Managed Extensibility Framework (MEF) è una nuova libreria inglobata nel NET Framework 4.0 che permette un maggiore riutilizzo di applicazioni e componenti. Utilizzando MEF, le applicazioni possono essere compilate in modo dinamico
Mef, in definitiva, è un framework che offre alle applicazioni la capacità di essere estese dinamicamente attraverso componenti esterni noti solo a runtime
MEF in actiono Sviluppato come progetto condiviso e open source disponibile su http://mef.codeplex.com
o E’ il primo framework pensato per l’estendibilità
o Una delle feature più importanti al. NET Framework 4.0 rilasciato in aprile 2010
o Sviluppato secondo i canoni dell’attributed programming model
Cos’è MEF?o Semplifica la creazione di applicazioni estendibili
o Mette a disposizione capacità di discovery e di composition per caricare le extensions
o Incluso nell’assembly System.ComponentModel.Composition del .NET 4.0
o Trasversale rispetto alle tecnologie impiegate (Win Form, WPF, Silverlight, ASP.NET, ASP.NET MVC, WCF)
MEF in action - ABCCome funziona MEF?
o Export Ito Import ItoCompose It
MEF in action - ABCExport It
Part A
Definiamo prima il contratto del servizio [Part] da esporre
Utilizzando le interfacce per definire i contratti da esportare
Definiamo l’implementazione da rendere disponibile ai consumer
MEF in action - ABCImport It
Part A
Definiamo nel host /consumer della parte o delle parti, il punto di estensione
MEF in action - ABCCompose ItCome e dove cerca MEF le parti da utilizzare?
Assembly Catalog
Type Catalog
Catalog
Directory Catalog
Deployment Catalog
Aggregate Catalog
MEF in action - ABCCompose It
Container
Chi risolve i collegamenti tra import e export?
Explicit Composition VS Implicit Composition
MEF in depth
o ExportMetadata
o ImportMetadata
o PartMetadata + FilteredCatalog
o Lazy loading delle “Parti”
o Recomposition + Import Notification
o Deployment Catalog 4 Silverlight
o Ciclo di vita della “Parti”
Caratteristiche avanzate
MEF in depth
È possibile associare alla parti, metadati identificativi. Il «consumatore» delle parti, può utilizzare gli stessi per filtrare le implementazioni/e da utilizzare
ExportMetadata
E’ possibile creare attributi personalizzati
Dietro le quinte, MEF popolerà comunque un dictionary, ma questo è ininfluente per il programmatore
MEF in depth
Strongly-typed Metadata
ImportMetadata
Occhio al case sensitive rispetto agli attributi di export
Weakly-typed metadata
MEF in depthPartMetadata +
FilteredCatalogPossiamo «decorare» le parti da esportare utilizzando l’attributo PartMetadataAttribute
Può tranquillamente convivere con l’attributo ExportMetadata. In coppia con il FilteredCatalog, introdotto con la versione 2 del framework, consente di filtrare le parti e di effettuare la composizione/ricomposizione.
E’ innestabile nel bootstrapper di MEF, con qualche «barbatrucco» anche nella versione 1
MEF in depthLazy loading delle “Parti”Possiamo eseguire l’importazione solo quando strettamente necessaria utilizzando l'inizializzazione differita.
Utilizzando le classi Lazy<T> o Lazy<T, TMetadata> questa ultima utile in presenza di metadati, si impedisce di fatto la composizione ricorsiva del grafo delle parti
Utile quando ci sono molte «parti» interconnesse, o quando le parti possono consumare molti cicli di CPU e/o richiedere una grande quantità di risorse.
L’effettiva inizializzazione avviene alla prima richiesta della proprietà Value della parte
MEF in depthRecomposition + Import Notification
Con MEF è possibile ottenere la ricomposizione delle associazioni tra le parti in caso di aggiunta di nuove parti o rimozione delle stesse.
A seconda della logica applicativa: o Si può esplicitamente chiedere a MEF di ricomporre le associazioni tra le parti o Si può gestire la ricomposizione in ottica event-driven (il catalog individua un cambiamento ad esempio un nuovo assembly aggiunto nella cartella monitorata)
E’ possibile abilitare questa funzionalità, impostando la property AllowRecomposition dell’attributo Import/ImportMany a true
Implementando l’interfaccia IPartImportsSatisfiedNotification è possibile ottenere la notifica relativa alla avvenuta ricomposizione.
Il .Net framework blocca in modo esclusivo gli assembly contenuti nei catalog, per utilizzare le tecniche descritte è necessario un altro barbatrucco
MEF in depthCiclo di vita delle parti
In MEF le parti “vivono” di fatto nel composition container.
Il composition container è l’unica entità che può instanziare o distruggere una parte.
Una parte può essere:
o Shared
una sola instanza della parte vive all’interno del composition container per tutte le richieste
o NonShared
ogni richiesta per la parte è servita da una nuova instanza
L’attributo [PartCreationPolicy()] ci consente di indicare in fase di export il tipo di CreationPolicy da utilizzare
Mentre un parametro dell’attributo [Import] ci consente di importare solo le parti che implementano un certo tipo di CreationPolicy
Quando il container viene distrutto tutti i riferimenti alle parti vengono ripuliti. Per le parti che implementano l’interfaccia Idisposable, viene chiamato il metodo Dispose.
Il futuro di MEFNuove caratteristiche
Nella v2 disponibile su Codeplex, attualmente alla versione Preview 3
Support for open generics
Support for attribute-less registration of types aka MEF’s Convention model
Filtered Catalog integrato
ExportFactory<IAddin>
A project without a "v.Next" in the works is a dead project. (cit.)
Concludendo
Perché dovrei usare MEF?
MEF helps you stay young (cit.)
Sviluppo
Manutenzione20%
20%
60%Tempo libero
Risorsehttp://mef.codeplex.com/
http://mef.uservoice.com/forums/75901-general
https://github.com/MefContrib
Team member Blog
Krzysztof Cwalinahttp://blogs.msdn.com/kcwalina/
Mircea Troffinhttp://blogs.msdn.com/mirceat/
Wes Haggardhttp://weblogs.asp.net/whaggard/
David Kean http://davesbox.com/
Daniel Plaistedhttp://blogs.msdn.com/dsplaisted/
Glenn Block http://blogs.msdn.com/gblock/
Hamilton Verissimohttp://blogs.msdn.com/hammett/
Nicholas Blumhardthttp://blogs.msdn.com/nblumhardt/
MEF Team Blogs
Customer Feedback for MEF
MefContrib
Q & A
Domande ?
top related