Sie sind auf Seite 1von 24
Entwicklung modularer Anwendungen mit dem Managed Extensibility Framework Jörg Neumann Acando | Thinktecture
Entwicklung modularer Anwendungen mit dem Managed Extensibility Framework Jörg Neumann Acando | Thinktecture
Entwicklung modularer Anwendungen mit dem Managed Extensibility Framework Jörg Neumann Acando | Thinktecture

Entwicklung modularer Anwendungen mit dem Managed Extensibility Framework

Jörg Neumann Acando | Thinktecture
Jörg Neumann
Acando | Thinktecture
Entwicklung modularer Anwendungen mit dem Managed Extensibility Framework Jörg Neumann Acando | Thinktecture
Jörg Neumann • Beratung, Schulung, Coaching • Principal Consultant bei Acando • Associate bei Thinktecture
Jörg Neumann • Beratung, Schulung, Coaching • Principal Consultant bei Acando • Associate bei Thinktecture
Jörg Neumann
Jörg Neumann
Jörg Neumann • Beratung, Schulung, Coaching • Principal Consultant bei Acando • Associate bei Thinktecture •

Beratung, Schulung, Coaching

Principal Consultant bei Acando

Associate bei Thinktecture

• MVP im Bereich „Client App Dev

Buchautor, Referent

Mail

„Client App Dev “ • Buchautor, Referent • Mail – Joerg.Neumann@Acando.de • Blog –
– Joerg.Neumann@Acando.de
– Joerg.Neumann@Acando.de

Blog

– WWW.HeadWriteLine.BlogSpot.com
– WWW.HeadWriteLine.BlogSpot.com
Motivation • Gekapselte, module Anwendungen – Flexibel erweiterbar – Leicht zu pflegen • Team Development
Motivation • Gekapselte, module Anwendungen – Flexibel erweiterbar – Leicht zu pflegen • Team Development
Motivation • Gekapselte, module Anwendungen – Flexibel erweiterbar – Leicht zu pflegen • Team Development

Motivation

Gekapselte, module Anwendungen

Flexibel erweiterbar

Leicht zu pflegen

Team Development

Logische und physische Trennung der Module

3rd Party-Integration

Externe Erweiterungen

Modularer Architekturen • Anwendung besteht aus einer generischen Shell • Fachliche Module werden als atomare
Modularer Architekturen • Anwendung besteht aus einer generischen Shell • Fachliche Module werden als atomare
Modularer Architekturen • Anwendung besteht aus einer generischen Shell • Fachliche Module werden als atomare

Modularer Architekturen

Anwendung besteht aus einer generischen

Shell

Fachliche Module werden als atomare Einheiten entwickelt

Dynamisches Nachladen der Module

MEF • M anaged E xtensibility F ramework – Teil von .NET 4.0 & Silverlight
MEF • M anaged E xtensibility F ramework – Teil von .NET 4.0 & Silverlight
MEF • M anaged E xtensibility F ramework – Teil von .NET 4.0 & Silverlight

MEF

Managed Extensibility Framework

Teil von .NET 4.0 & Silverlight 4

System.ComponentModel.Composition

Dependency Injection Framework

Dynamisches Laden und Instanziieren

Basiert auf Attributen

Kann flexibel erweitert werden

Begriffsdefinition • Export – Exportierte Typen (Plug-Ins) • Imports – Verweis auf exportierte Typen •
Begriffsdefinition • Export – Exportierte Typen (Plug-Ins) • Imports – Verweis auf exportierte Typen •

Begriffsdefinition

Export

Begriffsdefinition • Export – Exportierte Typen (Plug-Ins) • Imports – Verweis auf exportierte Typen •

Exportierte Typen (Plug-Ins)

Imports

Verweis auf exportierte Typen

Parts

Imports und Exports

Composition

Verbinden von Parts

DEMO MEF in Action
DEMO MEF in Action
DEMO MEF in Action
DEMO MEF in Action
DEMO
MEF in Action
Catalogs • Zum Auffinden von Parts werden Catalogs verwendet – AssemblyCatalog – DirectoryCatalog –
Catalogs • Zum Auffinden von Parts werden Catalogs verwendet – AssemblyCatalog – DirectoryCatalog –

Catalogs

Catalogs • Zum Auffinden von Parts werden Catalogs verwendet – AssemblyCatalog – DirectoryCatalog –

Zum Auffinden von Parts werden Catalogs

verwendet

AssemblyCatalog

DirectoryCatalog

TypeCatalog

AggregatingCatalog

Namespace

System.ComponentModel.Composition.Hosting

Recomposition • Erlaubt dynamische Änderungen an der Composition zur Laufzeit – z.B. weil eine neue
Recomposition • Erlaubt dynamische Änderungen an der Composition zur Laufzeit – z.B. weil eine neue
Recomposition • Erlaubt dynamische Änderungen an der Composition zur Laufzeit – z.B. weil eine neue

Recomposition

Erlaubt dynamische Änderungen an der

Composition zur Laufzeit

z.B. weil eine neue Assembly ins Arbeitsverzeichnis kopiert wurde

Definition:

[ImportMany(AllowRecomposition = true)] public IEnumerable<IExtension> Extensions { get; set; }
[ImportMany(AllowRecomposition = true)]
public IEnumerable<IExtension> Extensions { get; set; }
Part Lifetime • Die Lebensdauer von Parts kann gesteuert werden • PartCreationPolicy -Attribut im Export
Part Lifetime • Die Lebensdauer von Parts kann gesteuert werden • PartCreationPolicy -Attribut im Export
Part Lifetime • Die Lebensdauer von Parts kann gesteuert werden • PartCreationPolicy -Attribut im Export

Part Lifetime

Die Lebensdauer von Parts kann gesteuert

werden

PartCreationPolicy-Attribut im Export

RequiredCreationPolicy-Parameter im Import/ImportMany-Attribut

Part Lifetime Import: [ ImportMany ( RequiredCreationPolicy = CreationPolicy .NonShared )] public IEnumerable <
Part Lifetime Import: [ ImportMany ( RequiredCreationPolicy = CreationPolicy .NonShared )] public IEnumerable <

Part Lifetime

Part Lifetime Import: [ ImportMany ( RequiredCreationPolicy = CreationPolicy .NonShared )] public IEnumerable <

Import:

[ImportMany(

RequiredCreationPolicy = CreationPolicy.NonShared)]

public IEnumerable<IExtension> Extensions { get; set; }

Export:

[Export(typeof(IExtension))]

[PartCreationPolicy(CreationPolicy.NonShared)] public class MyExtension

{ …

}

On-Demand Creation • Instanz wird explizit erzeugt und nicht automatisch bei der Composition • Basiert
On-Demand Creation • Instanz wird explizit erzeugt und nicht automatisch bei der Composition • Basiert

On-Demand Creation

On-Demand Creation • Instanz wird explizit erzeugt und nicht automatisch bei der Composition • Basiert auf

Instanz wird explizit erzeugt und nicht

automatisch bei der Composition

Basiert auf Lazy<T>

Definition:

[ImportMany] public IEnumerable<Lazy<IExtension>> Extensions { get; set; }
[ImportMany]
public IEnumerable<Lazy<IExtension>> Extensions { get; set; }

Verwendung:

var extension = this.Extensions.First().Value;
var extension = this.Extensions.First().Value;
Metadaten • Parts können Metadaten bereitstellen – Werden in Form von Attributen bereitgestellt • Ermöglicht
Metadaten • Parts können Metadaten bereitstellen – Werden in Form von Attributen bereitgestellt • Ermöglicht
Metadaten • Parts können Metadaten bereitstellen – Werden in Form von Attributen bereitgestellt • Ermöglicht

Metadaten

Parts können Metadaten bereitstellen

Werden in Form von Attributen bereitgestellt

Ermöglicht Filterung während der Composition

Metadaten Deklaration (Export): [ Export ( typeof ( IExtension ))] [ ExportMetadata ( "Language" ,
Metadaten Deklaration (Export): [ Export ( typeof ( IExtension ))] [ ExportMetadata ( "Language" ,

Metadaten

Deklaration (Export):

Metadaten Deklaration (Export): [ Export ( typeof ( IExtension ))] [ ExportMetadata ( "Language" ,

[Export(typeof(IExtension))]

[ExportMetadata("Language", "German")]

public class Extension1 : IExtension }

{

Deklaration (Import):

[ImportMany] IEnumerable<Lazy<IExtension, IDictionary<string, object>>> Extensions { get; set; }

Verwendung:

foreach (var ext in this.Extensions)

{

if (ext.Metadata.ContainsKey("Language") && ext.Metadata["Language"].ToString() == "German") { …}

}

Custom Metadata • Es können typisierte Metadaten-Attribute erstellt werden – Ableitung von ExportAttribute –
Custom Metadata • Es können typisierte Metadaten-Attribute erstellt werden – Ableitung von ExportAttribute –

Custom Metadata

Custom Metadata • Es können typisierte Metadaten-Attribute erstellt werden – Ableitung von ExportAttribute –

Es können typisierte Metadaten-Attribute

erstellt werden

Ableitung von ExportAttribute

Definition eines Metadaten-Interface

Custom Metadata Implementierung: [ MetadataAttribute ] [ AttributeUsage ( AttributeTargets .Class)] public class
Custom Metadata Implementierung: [ MetadataAttribute ] [ AttributeUsage ( AttributeTargets .Class)] public class

Custom Metadata

Implementierung:

Custom Metadata Implementierung: [ MetadataAttribute ] [ AttributeUsage ( AttributeTargets .Class)] public class

[MetadataAttribute]

[AttributeUsage(AttributeTargets.Class)] public class LanguageAttribute : ExportAttribute, IMyMetadata

{

public Language Language { get; set; }

}

public enum Language : int

{

 

German,

English

}

public interface IMyMetadata

{

Language Language { get; set; }

}

Custom Metadata Deklaration (Export): [ Export ( typeof ( IExtension ))] [ LanguageAttribute (Language =
Custom Metadata Deklaration (Export): [ Export ( typeof ( IExtension ))] [ LanguageAttribute (Language =

Custom Metadata

Deklaration (Export):

Custom Metadata Deklaration (Export): [ Export ( typeof ( IExtension ))] [ LanguageAttribute (Language = Language

[Export(typeof(IExtension))] [LanguageAttribute(Language = Language.German)] public class Extension1 : IExtension

{

}

Deklaration (Import):

[ImportMany] public IEnumerable<Lazy<IExtension, IMyMetadata>> Extensions

 

{ get; set; }

Verwendung:

 

foreach (var ext in this.Extensions)

{

 

if (ext.Metadata.Language == Language.English)

{ …

}

}

Silverlight Features in MEF • DeploymentCatalog – Dynamisches Nachladen von XAPs – Schneller Anwendungsstart •
Silverlight Features in MEF • DeploymentCatalog – Dynamisches Nachladen von XAPs – Schneller Anwendungsstart •
Silverlight Features in MEF • DeploymentCatalog – Dynamisches Nachladen von XAPs – Schneller Anwendungsstart •

Silverlight Features in MEF

DeploymentCatalog

Dynamisches Nachladen von XAPs

Schneller Anwendungsstart

Dynamic Part Creation

On-Demand Composition

Module werden erst geladen & instanziiert wenn sie benötigt werden

DEMO Silverlight Features
DEMO Silverlight Features
DEMO Silverlight Features
DEMO Silverlight Features
DEMO
Silverlight Features
Sonstiges • Konstruktor-Parameter importieren – ImportingConstructor -Attribut • Exports können public oder
Sonstiges • Konstruktor-Parameter importieren – ImportingConstructor -Attribut • Exports können public oder

Sonstiges

Sonstiges • Konstruktor-Parameter importieren – ImportingConstructor -Attribut • Exports können public oder

Konstruktor-Parameter importieren

ImportingConstructor-Attribut

Exports können public oder non-public sein

Non-public nicht unter Partial Trust

CompositionBatch

Ermöglicht dyn. Laden & Entladen von Parts

Benachrichtigung beim Importieren

IPartImportsSatisfiedNotification-Interface

Herausforderungen • Konfiguration – Welche Parts sollen zur Laufzeit geladen werden? • Zugriff auf „
Herausforderungen • Konfiguration – Welche Parts sollen zur Laufzeit geladen werden? • Zugriff auf „

Herausforderungen

Konfiguration

Herausforderungen • Konfiguration – Welche Parts sollen zur Laufzeit geladen werden? • Zugriff auf „ Shared

Welche Parts sollen zur Laufzeit geladen

werden?

• Zugriff auf „Shared Services“

Anwendung muss einen Service Locator

bereitstellen

Kommunikation mit Anwendung/Parts

Anwendung muss einen Messaging-System

bereitstellen

Limitationen • Absicherung der Anwendung – Zuweisen von Rechten gegenüber dem Part – Fehler in
Limitationen • Absicherung der Anwendung – Zuweisen von Rechten gegenüber dem Part – Fehler in
Limitationen • Absicherung der Anwendung – Zuweisen von Rechten gegenüber dem Part – Fehler in

Limitationen

Absicherung der Anwendung

Zuweisen von Rechten gegenüber dem Part

Fehler in Part darf die App nicht beeinflussen

Part wird stets in die AppDomain der

Anwendung geladen!

Versionierung

App V1 läuft mit Part V2 und umgekehrt

Deployment

Parts müssen u.U. separat verteilt werden

Zusammenfassung • MEF ist ein gutes Werkzeug um Anwendungen zu entwickeln die… … gut gekapselt
Zusammenfassung • MEF ist ein gutes Werkzeug um Anwendungen zu entwickeln die… … gut gekapselt

Zusammenfassung

Zusammenfassung • MEF ist ein gutes Werkzeug um Anwendungen zu entwickeln die… … gut gekapselt sind

MEF ist ein gutes Werkzeug um

Anwendungen zu entwickeln die…

… gut gekapselt sind

… flexibel erweiterbar sind

… besser getestet werden können

… besser gewartet werden können

Für Add-In-Modelle besser MAF

Security, Versionierung, Metadata Cache, …

Für stabile 3rd-Party-Erweiterungen

{ In-depth support and consulting for software architects and developers } www.thinktecture.com
{ In-depth support and consulting for software architects and developers }
{
In-depth support and consulting for
software architects and developers
}
architects and developers } www.thinktecture.com joerg.neumann@thinktecture.com http://headwriteline.blogspot.com 29

29