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
Scarica

MEF