MEF & Silverlight 4: Extensible Applications Applicazioni estensibili impiegando MEF e Silverlight 4 » Davide Zordan – MVP Silverlight, Silverlight Insider Agenda Cos’è MEF? A cosa serve? Pattern e framework applicativi: Prism, MEF & beyond Introduzione a MEF: Export, Import, Compose Custom Attributes e Metadata Download dinamico mediante il DeploymentCatalog MEF e pattern MVVM: un caso pratico 30/04/2010 www.xedotnet.org 2 Cos’è MEF MEF (Managed Extensibility Framework) è una nuova libreria presente in .NET Framework 4 e Silverlight 4 per semplificare la progettazione di sistemi componibili, estensibili e componibili anche dopo il deploy. 30/04/2010 www.xedotnet.org 3 Perché MEF Perchè creare delle Applicazioni estensibili: • Per risolvere un problema comune: creare applicazioni da componenti riutilizzabili che possono essere scoperte, riutilizzare e composte in modo dinamico • es. sistema a plug-in di Visual Studio; • semplificare la manutenzione del codice; • semplificare l’aggiunta di nuove funzionalità; • rendere il codice più elegante. 17/01/2008 www.xedotnet.org 4 MEF: concetti fondamentali Concetti fondamentali: • Export, Import, Compose, Metadata • Export -> è un servizio che fornisce un componente (Part); • Import -> possono importare singoli o più servizi (esempio un logger o un'estensione di editor); • Compose -> le parti sono composte da MEF; • Metadata -> specificano informazioni aggiuntive relative alle «Part» esposte. 30/04/2010 www.xedotnet.org 5 Esportazione di una classe: [Export] public partial class ShellView : UserControl { public ShellView () { InitializeComponent(); } } 30/04/2010 www.xedotnet.org 6 Esportazione tramite proprietà: public class Loggerpart { [Export] public ILog Logger { get { return LogManager.GetLogger("Logger"); } } } 30/04/2010 www.xedotnet.org 7 Importazione tramite proprieta' e campi [Export] public class ViewFactory { [Import] public ShellView shellView { get; set; } } 30/04/2010 www.xedotnet.org 8 Importazione tramite costruttori [Export] public class ViewFactory { [ImportingConstructor] public ViewFactory(ShellView shellView) { } } 30/04/2010 www.xedotnet.org 9 Composizione Composizione mediante il CompositionInitializer: CompositionInitializer.SatisfyImports(this); 30/04/2010 www.xedotnet.org 10 PartCreationPolicy [PartCreationPolicy(CreationPolicy.NonShared)] [Export(typeof(IShellView))] public partial class ShellView : UserControl, IShellView { public ShellView() { } } 30/04/2010 www.xedotnet.org 11 Esportazioni multiple [Export] public class ViewFactory { [ImportMany] IEnumerable<IView> Views { get; set; } } [Export(typeof(IView))] public partial class ShellView : UserControl, IView { } public interface IView{} 30/04/2010 www.xedotnet.org 12 Attributi personalizzati di esportazione [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] public class ExportMainPageVMAttribute : ExportAttribute { public ExportMainPageVMAttribute(): base(typeof(ViewModelBase)) { } } 30/04/2010 www.xedotnet.org 13 Utilizzo public partial class MainPageView : UserControl { public MainPageView() { InitializeComponent(); CompositionInitializer.SatisfyImports(this); this.DataContext = mainPageViewModel; } [ImportMainPageVMAttribute] public object mainPageViewModel { get; set; } } 30/04/2010 www.xedotnet.org 14 Esportazioni multiple e Metadata public class SimpleMEFProvider { [Export("SimpleText")] [ExportMetadata("Index",0)] public string aSimpleTextProvider { get { return "This is a simple Text MEF Imported"; } } [Export("SimpleText")] [ExportMetadata("Index",1)] public string anotherSimpleTextProvider { get { return "This is another simple Text MEF Imported"; } } } 30/04/2010 www.xedotnet.org 15 Import Metadata public partial class MainPage : UserControl { public MainPage() { InitializeComponent(); CompositionInitializer.SatisfyImports(this); } //Multiple Exports detected: use ImportMany [ImportMany("SimpleText")] public IEnumerable<Lazy<string,IMetadataContent>> textProperty { get; set; } //Used to retrieve the value of the Metadata Exported by MEF public interface IMetadataContent { int Index { get; } } } 30/04/2010 www.xedotnet.org 16 Demo 1: Simple Composition 30/04/2010 www.xedotnet.org 17 Demo 1: Export, Import, Compose! 30/04/2010 www.xedotnet.org 18 Demo 2: Export multipli 30/04/2010 www.xedotnet.org 19 Demo 3: Export multipli 30/04/2010 www.xedotnet.org 20 Demo 4: Simple MEF-MVVM 30/04/2010 www.xedotnet.org 21 Demo 5: Simple MEF-MVVM 30/04/2010 www.xedotnet.org 22 Demo 6: Export Factory 30/04/2010 www.xedotnet.org 23 Demo 7: MEF & (PRISM) Event Aggregator 30/04/2010 www.xedotnet.org 24 Demo 8: MEF & DeploymentCatalog 30/04/2010 www.xedotnet.org 25 Riepilogo Cos’è MEF Perché MEF Concetti fondamentali: Export, Import, Compose, Contracts Composizioni semplici e multiple, Metadata Attributi Custom, Export Factory MEF e MVVM Deploy dinamico mediante il DeploymentCatalog 30/04/2010 www.xedotnet.org 26 Link How to reach me blog: email: web: twitter: 30/04/2010 http://www.davidezordan.net/blog [email protected] http://silverlightexperts.net http://twitter.com/davidezordan www.xedotnet.org 27