MEF Deep Dive by Piotr Wlodek

Post on 06-May-2015

2.068 views 2 download

Transcript of MEF Deep Dive by Piotr Wlodek

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