So arbeiten Sie mit dem Managed Extensibility Framework in C #

Das MEF (Managed Extensibility Framework) ist eine Komponente, die mit .Net Framework 4 (oder höher) geliefert wird und Ihnen hilft, Anwendungen zu erstellen, die leichtgewichtig und erweiterbar sind, indem Sie eine lose gekoppelte Plugin-ähnliche Architektur verwenden. Sie können dieses Framework nutzen, um Erweiterungen zu erkennen und zu nutzen, ohne dass eine Konfiguration erforderlich ist. Durch die Verwendung von MEF können Sie die Flexibilität, Wartbarkeit und Testbarkeit Ihrer Anwendungen mühelos verbessern. Bei Verwendung von MEF können Sie die Erweiterungen innerhalb derselben Anwendung oder sogar anwendungsübergreifend wiederverwenden.

In der MSDN heißt es: "Das Managed Extensibility Framework oder MEF ist eine Bibliothek zum Erstellen leichter, erweiterbarer Anwendungen. Es ermöglicht Anwendungsentwicklern, Erweiterungen ohne Konfiguration zu erkennen und zu verwenden. Außerdem können Erweiterungsentwickler Code einfach kapseln und fragile harte Abhängigkeiten vermeiden. MEF Damit können Erweiterungen nicht nur innerhalb von Anwendungen, sondern auch anwendungsübergreifend wiederverwendet werden. "

DI, IoC und MEF

DI (Dependency Injection) ist eine Realisierung des IoC-Prinzips (Inversion of Control). Wenn ein Objekt von anderen Objekten abhängig ist, sollten solche Objekte mithilfe eines separaten Frameworks oder einer separaten Komponente erstellt werden. Während IoC die Fähigkeit ist, die Implementierung eines Vertrags zu variieren, ist DI die Fähigkeit, die erforderliche Implementierung bereitzustellen, wenn dies gewünscht wird. Beachten Sie, dass Sie IoC-Container verwenden sollten, wenn Ihre Abhängigkeiten statisch sind. Wenn sie dynamisch sind, ist MEF viel nützlicher. Grundsätzlich bieten die DI-Container Unterstützung für Objektzusammensetzung, Lebensdauerverwaltung und Abfangen.

Im Gegensatz zu einem typischen Abhängigkeitsinjektionscontainer wie Unity, NInject bietet Castle Windsor MEF nur Unterstützung für die Objektzusammensetzung. MEF bietet Ihnen eine Möglichkeit, Plug-Ins zu erweitern - eine Funktion, die die typischen IOC-Container nicht unterstützen.

MEF ist eine verwaltete Bibliothek, die Teil der neuesten Versionen von .Net Framework ist (genauer gesagt seit .Net Framework 4), um Erweiterungen durch Komposition zu erkennen, ohne dass eine Konfiguration erforderlich ist. Eine Komponente in MEF ist als Teil bekannt. Ein Teil gibt seine Abhängigkeiten und Fähigkeiten deklarativ an. Diese Abhängigkeiten werden als "Importe" bezeichnet und die Funktionen werden über "Exporte" dargestellt. Beachten Sie, dass für ein Teil das Attribut "Exportieren" angegeben werden sollte.

Anfangen

Wenn Sie mit MEF arbeiten, können Sie einen der beiden Ansätze verwenden. Dazu gehören: die auf Attributen und Konventionen basierenden Ansätze. Bei Verwendung des ersteren nutzen Sie normalerweise die Attribute Ihres Codes. Im letzteren Fall möchten Sie im letzteren Fall eine Reihe von Regeln erstellen und dann die geltenden und die nicht zutreffenden Regeln bestimmen. In diesem Beispiel werden wir den ersten Ansatz untersuchen.

MEF bietet Ihnen Erweiterbarkeit durch ein Plug-In-Framework. Der System.Composition-Namespace bietet Unterstützung für MEF in .Net. Um mit der Verwendung von MEF in Ihrer Anwendung zu beginnen, sollten Sie die System.Composition-Assembly als Referenz auf Ihr Projekt einfügen.

Betrachten Sie nun die folgende Schnittstelle mit dem Namen ILogger.

public interface ILogger

   {

       string Message { get; set; }

   }

The following classes FileLogger and DbLogger implement the ILogger interface.

[Export]

   public class FileLogger : ILogger

   {      

       public string Message

       {

           get;set;

       }

   }

[Export]

   public class DbLogger : ILogger

   {

       public string Message

       {

           get; set;

       }

   }

Auf den ersten Blick könnte man annehmen, dass MEF wie ein DI-Container ist. Obwohl MEF wie ein DI-Container aussieht, zielt es hauptsächlich auf Erweiterbarkeit ab. Im Wesentlichen nutzt MEF einen Attribut-basierten Erkennungsmechanismus, um die Erweiterbarkeit zu fördern, ohne dass die Komponenten konfiguriert werden müssen. Sie brauchen keine Registrierung - Sie müssen nur Ihre Typen mit dem Export-Attribut markieren und alles erledigt für Sie. Im Gegensatz zu Unity können Sie bei Verwendung von MEF Ihre Klassen nur mit Attributen markieren, ohne sie einzeln registrieren zu müssen. Die exportierten Werte werden alle in einem Container gespeichert. Die folgende Klasse zeigt, wie Sie einen benutzerdefinierten MEF-Container erstellen und alle Exporte aus dem Verzeichnis speichern können, in dem sich die aktuell ausgeführte Assembly befindet.

public static class MEFContainer

   {

       private static CompositionContainer compositionContainer = null;

       public static CompositionContainer Container

       {

           get

           {

               if (compositionContainer == null)

               {

                   var directoryCatalog =

                        new DirectoryCatalog(

                       Path.GetDirectoryName(

                       Assembly.GetExecutingAssembly().Location));

                   compositionContainer = new CompositionContainer(directoryCatalog);

               }

               return compositionContainer;

           }

       }

   }

Das folgende Codeausschnitt zeigt, wie Sie eine Instanz vom Typ FileLogger über den Container abrufen können.

FileLogger fileLogger = MEFContainer.Container.GetExportedValue();

Um eine Instanz vom Typ DbLogger abzurufen, können Sie das folgende Codefragment verwenden.

DbLogger dbLogger = MEFContainer.Container.GetExportedValue();