Post on 06-May-2015
Managed Extensibility Framework
Piotr Włodek
Deep Dive
Agenda
Managed Extensibility Framework
Extending MEF
• Breaks up large chunks of functionality into smaller pieces• Allows the teams to work in parallel• Allows to deliver additional functionality by 3rd parties• Isolation – if a plugin crashes, the rest of the app keeps
working
Plug-ins \ Modules
Managed Addin Framework
• Design pattern• Creates graphs of objects• Manages dependencies between objects• Manages lifetime of the objects
Dependency Injection
public SampleViewModel( IShell shell, ISampleView view, IEventAggregator eventAggregator, IPersistenceFacade persistenceManager, ILoggerService loggerService, IExceptionManager exceptionManager, IWindowManagerExt windowManager) { ... }
P&P Unity 2.0
Autofac Ninject Castle
IoC + MAF = MEF ?
IoC Container
Managed Addin Framework
Managed Extensibility Framework
• An extensible framework for composing applications from a set of loosely-coupled components discovered and evolving at runtime
• Applications are no longer statically compiled, they are dynamically composed (Recomposition)
• Supported in BCL 4.0 and Silverlight 4 • Available for .NET 3.5 / SL 3 (Codeplex Drop 9)• MEF 2 Drop 2 available for download!• Lives in the System.ComponentModel.Composition.dll• SL has also some additional stuff in the
System.ComponentModel.Composition.Initialization.dll
Managed Extensibility Framework
Composable parts.
• Application consists of composable parts
Parts. Exports. Imports.
Partexportexport
importimportimport
• PartDefinition is a blueprint for a Part (similar to .NET Type and Object)
• Part represents the exported value
Parts and their definitions.
Partexportexport
importimportimport
PartDefinition
export
importPartDefinition
export
import
CreatePart()
ObjectGetExportedValue()
Export it.
Logger
[Export(typeof(ILogger))]public class Logger : ILogger{ public void Info(string message) { Console.WriteLine(message); }}
Export
ILogger
Import it.
Program
public class Program{
[Import]public ILogger Logger { get; set; }
private static void Main() { var p = new Program(); p.Run();}
}
Import
ILogger
Container takes parts from catalogs.
CompositionContainer
Catalog
Catalog Catalog Catalog
PartDefinitionPartDefinitionPartDefinitionPartDefinitionPartDefinitionPartDefinitionPartDefinitionPartDefinition
PartDefinitionPartDefinitionPartDefinitionPartDefinition
Compose it.
part
exportexport
importimport
import
partimportimportimport
partexport
import
part
export
importimport
Composition Container
part
part
part
part
part
part
FE
M
Compose it.
Program
private void Run(){ var catalog = new AssemblyCatalog(...); var container = new CompositionContainer(catalog); container.ComposeParts(this);
Logger.Info("Hello World!");}
Compose
DEMO 1 – MEF BASICS
Available Catalogs.
AssemblyCatalog
TypeCatalog
DirectoryCatalog
AggregateCatalog
DeploymentCatalog
• Types• Properties• Fields• Methods
Exportable components.
Export it.
Utils
public class Utils{ [Export("Logger.Prompt")] public string LoggerPrompt { get { return "Logger Prompt: "; } }
[Export("Logger.ProcessText")] public string Process(string input) { ... }}
Export
"Logger.Prompt„"Logger.ProcessText"
Import it.
FunnyLogger
[Export(typeof(ILogger))]public class FunnyLogger : ILogger{ [Import("Logger.Prompt")] private string m_Prompt;
[Import("Logger.ProcessText")] private Func<string, string> m_TextFun;}
Import
"Logger.Prompt""Logger.ProcessText"
DEMO 2 – EXPORTS
Which parts goes together ?
partexportexport
importimportimport
partimport
? Contract
Name
TypeIdentity
Cardinality
CreationPolicy
Metadata
IsRecomposable
IsPrerequisit
Contract
Name
TypeIdentity
CreationPolicy
Metadata
DEMO 3 - WIDGETS
Metadata.
Widget Widget
Where to place that widget ?
Export it. Metadata.
TwitterWidget
[Export(typeof(IWidget))][ExportMetadata("Location", WidgetLocation.Right)]public partial class TwitterWidget : ITwitterWidget{ [Import] public TwitterWidgetPresentationModel PresentationModel { get; set; }}
ExportIWidget
Put me on the right
Import it. Metadata.
ShellPM
[Export]public class ShellPresentationModel{ [ImportMany] public Lazy<IWidget, IWidgetMetadata>[] Widgets { get; private set; }}
Import
Collection of Lazy IWidgets with IWidgetMetadata
DEMO 4 – WIDGETS AND METADATA
Export it. In a custom way.
TwitterWidget
[Export(typeof(IWidget))][ExportMetadata("Location", WidgetLocation.Right)]public partial class TwitterWidget : ITwitterWidget{ [Import] public TwitterWidgetPresentationModel Model { get; set; }}
ExportIWidget
Put me on the right
Export it. In a custom way.
TwitterWidget
[Widget(WidgetLocation.Right)]public partial class TwitterWidget : ITwitterWidget{ [Import] public TwitterWidgetPresentationModel Model { get; set; }}
ExportIWidget
Put me on the right
DEMO 5 – CUSTOM EXPORT
Recomposition.
CompositionContainer
PartDefinitionPartDefinition PartDefinition
part
Compose()
partpart
Parts introduced to or removed from the container may have an impact on this import – a part can opt-in to allow this recomposition.
part?
Catalog
PartDefinition
Catalog Catalog
Recomposition.
ShellPM
[Export]public class ShellPresentationModel{ [ImportMany(AllowRecomposition = true)] public Lazy<IWidget, IWidgetMetadata>[] Widgets { get; private set; }}
Import
Collection of Lazy IWidgets with IWidgetMetadata
DEMO 5 - RECOMPOSITION
Stable composition.
part
part
requires
requires
missing
part
part
part
requires zero or more
requires
Parts with missing required imports are rejected.
DEMO 6 – STABLE COMPOSITION
• Visual Studio Output Window• Microsoft.ComponentModel.Composition.Diagnostics.dll• Mefx
– mefx /file:MyAddIn.dll /directory:dir /rejected /verbose
Debugging MEF
[Part] ClassLibrary1.ChainOne from: AssemblyCatalog (Assembly="ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null") [Primary Rejection] [Export] ClassLibrary1.ChainOne (ContractName="ClassLibrary1.ChainOne") [Exception] System.ComponentModel.Composition.ImportCardinalityMismatchException: No valid exports were found that match the constraint '((exportDefinition.ContractName == "ClassLibrary1.ChainTwo") AndAlso exportDefinition.Metadata.ContainsKey("ExportTypeIdentity") AndAlso "ClassLibrary1.ChainTwo".Equals(exportDefinition.Metadata.get_Item("ExportTypeIdentity"))))', invalid exports may have been rejected.
Visual MEFX
DEMO 7 – DEBUGGING MEF
• Trim up your apps, break up your xaps!• Available only in Silverlight
DeploymentCatalog
DEMO 8 – DEPLOYMENT CATALOG
• A set of extensions developed by community• Where can I find it ?
– www.mefcontrib.com– www.mefcontrib.codeplex.com– http://github.com/MefContrib/
• MefContrib• MefContrib-Samples• MefContrib-Tools
MEF Contrib
• InterceptingCatalog – enables interception• ConventionCatalog – conventions based programming
model• FilteringCatalog – enables parts filtering based on any
criteria• GenericCatalog – enables support for open-generics• FactoryExportProvider – factory based registration• IoC integration layer – MEF / Unity
MefContrib – what’s in it for me?
DEMO 9 – MEF CONTRIB
Extending MEF
MEF
Programming Models
Export Providers
Export Providers.
ExportProvider
CompositionContainer
ExportProvider
Catalog
CatalogExportProvider
ExportProviderAggregateExportProvider
ExportProvider
CatalogExportProvider
ExportProvider
CompositionContainer
• MEF ships with Attributed programming model
• Programming models are extensible
Programming models.
MEF Primitives
ComposablePartCatalogComposablePartDefinitionComposablePart
ExportDefinition
ImportDefinition
Export
ReflectionModelServices
PartDef ExportDef ImportDef
• + Ease of programming• + Resolves dependencies between components • + Automatic component discovery• + Can compose types, fields, props and methods• - Slower than the IoC containers• - Lack of some IoC features
– Method injection– Assisted injection– Lifetime management
• - No component separation (separate appdomain, process)
MEF vs IoC vs MAF
• Managed Extensibility Framework
http://mef.codeplex.com/• MEF in MSDN Magazine
http://msdn.microsoft.com/en-us/magazine/ee291628.aspx• MEF Contrib
http://mefcontrib.com/• Glenn Block’s Blog
http://blogs.msdn.com/b/gblock/• Piotr Włodek’s Blog
http://pwlodek.blogspot.com/
Useful links