28
Da IPlugin a MEF: costruire applicazioni estendibili Leo Alario http://dotnetside.org/blogs/leo http://twitter.com/leo_alario

I plugin mef

Embed Size (px)

Citation preview

Page 1: I plugin mef

Da IPlugin a MEF: costruire applicazioni estendibili

Leo Alario

http://dotnetside.org/blogs/leohttp://twitter.com/leo_alario

Page 2: I plugin mef

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à

Page 3: I plugin mef

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

Page 4: I plugin mef

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

Page 5: I plugin mef

L’estendibilità nei sistemi softwareInoltre …Dobbiamo confrontarci con il vecchio problema del ciclo di vita di un software

Sviluppo

Manutenzione80%

20%

La soluzione?

Extensibility

Page 6: I plugin mef

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

Page 7: I plugin mef

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

Page 8: I plugin mef

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à

Page 9: I plugin mef

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

Page 10: I plugin mef

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

Page 11: I plugin mef

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

Page 12: I plugin mef

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)

Page 13: I plugin mef

MEF in action - ABCCome funziona MEF?

o Export Ito Import ItoCompose It

Page 14: I plugin mef

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

Page 15: I plugin mef

MEF in action - ABCImport It

Part A

Definiamo nel host /consumer della parte o delle parti, il punto di estensione

Page 16: I plugin mef

MEF in action - ABCCompose ItCome e dove cerca MEF le parti da utilizzare?

Assembly Catalog

Type Catalog

Catalog

Directory Catalog

Deployment Catalog

Aggregate Catalog

Page 17: I plugin mef

MEF in action - ABCCompose It

Container

Chi risolve i collegamenti tra import e export?

Explicit Composition VS Implicit Composition

Page 18: I plugin mef

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

Page 19: I plugin mef

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

Page 20: I plugin mef

MEF in depth

Strongly-typed Metadata

ImportMetadata

Occhio al case sensitive rispetto agli attributi di export

Weakly-typed metadata

Page 21: I plugin mef

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

Page 22: I plugin mef

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

Page 23: I plugin mef

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

Page 24: I plugin mef

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.

Page 25: I plugin mef

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.)

Page 26: I plugin mef

Concludendo

Perché dovrei usare MEF?

MEF helps you stay young (cit.)

Sviluppo

Manutenzione20%

20%

60%Tempo libero

Page 27: I plugin mef

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

Page 28: I plugin mef

Q & A

Domande ?