Mithilfe des Managed Extensibility Frameworks lassen sich aus einzelnen Komponenten flexibel Anwendungen zusammenstellen. Der Dependency Injection Manager basiert dabei auf den Attributen Import, Export sowie einem Katalog.
Über das Attribut Export stellt eine Klasse eine Funktionalität zur Verfügung.
1: [Export(typeof(IReportingService))]
2: [PartCreationPolicy(CreationPolicy.Shared)]
3: public class ReportingService : IReportingService
4: {
5: // IReportingService Members
6: }
Durch Angabe eines Import Attributs kann auf diese von einer anderen Klasse zugegriffen werden.
1: [Export(typeof(ReportViewModel))]
2: public class ReportViewModel
3: {
4: [Import (typeof(IReportingService)]
5: private IReportingService ReportingService { get; set; }
6: }
Ein Katalog stellt alle Informationen über verfügbare Exporte und angeforderte Importe zur Verfügung.
Über die Komposition der Katalogbestandteile werden die Komponenten zu einer Anwendung verknüpft. Durch die Aufnahme von unterschiedlichen Komponenten in den Katalog kann die Funktionalität einer Anwendung flexibel konfiguriert werden.
MEF wurde als Bestandteil des .NET Frameworks 4.0 veröffentlicht und hat inzwischen eine starke Verbreitung gefunden. Im .NET Framework 4.5 wurden Erweiterungen ergänzt, die die tägliche Entwicklungsarbeit vereinfachen.
Verbesserte Fehlerausgabe
Während der Komposition einer Anwendung werden die im Katalog befindlichen Exporte zu angeforderten Importen zugeordnet. Hierbei können komplexe Strukturen entstehen, die teilweise nur noch schwer überblickt werden können. So ist es möglich das nicht für alle angeforderten Imports auch entsprechende Komponenten, die entsprechende Exports zur Verfügung stellen, in den Katalog aufgenommen wurden. Dies führt beim Start der Anwendung zu einem Ausnahmefehler.
Im .NET Framework 4.0 war es teilweise recht schwierig herauszufinden, welcher Import bzw. fehlender Export diesen Fehler verursacht hat. Um dies zu vereinfachen kann nun bei der Instantiierung des CompositionContainers ein Flag CompositionOptions.DisableSiltenRejections mitgegeben werden.
Geht man entsprechend vor, wird direkt beim ersten Auffinden eines fehlenden Typen im Katalog die Komposition abgebrochen und ein entsprechender Fehler mit konkreten Fehlerhinweisen ausgegeben.
Einbindung externer Bibliotheken
Für eine Einbeziehung von Komponenten in die Komposition ist eine Angabe eines Export Attributs notwendig. Klassen, die nicht über ein entsprechendes Attribut verfügen, bleiben außen vor. Dies stellt insbesondere dann ein Problem dar wenn der Quellcode, wie z. B. im Fall von zugekauften Komponenten, nicht angepasst werden kann.
Im .NET Framework 4.5 steht nun ein Hilfsmittel zur Verfügung über das fehlende Export Attribute ergänzt werden können. Über die Klasse RegistrationBuilder können für unterschiedliche Typen Exportdefinitionen festgelegt werden.
Dies macht die Einbeziehung auch von externen Bibliotheken in die Komposition möglich.
Unterstützung generischer Typen
Eine weitere Neuerung ist die Unterstützung von generischen Exports.
Die Typisierung wird beim Import vorgenommen. Eine Implementierung von einer Vielzahl von konkreten Klassen für eine generisch lösbare Aufgabe kann hierdurch vermieden werden.
Fazit
Die neuen Funktionen stellen eine konsequente Weiterentwicklung der bereits etablierten Technologie dar. Die kleinen Verbesserungen vereinfachen die tägliche Entwicklungsarbeit. Damit wurden wichtige Bausteine ergänzt, um die Erfolgsgeschichte fortzuschreiben.