Managed Extensibility Framework

In diesem Kapitel werden wir das Managed Extensibility Framework (MEF) diskutieren. MEF kann für die Erweiterbarkeit von Plugins von Drittanbietern verwendet werden oder die Vorteile einer lose gekoppelten Plugin-ähnlichen Architektur für reguläre Anwendungen nutzen.

  • MEF ist eine Bibliothek zum Erstellen leichter, erweiterbarer Anwendungen.

  • Anwendungsentwickler können Erweiterungen erkennen und verwenden, ohne dass eine Konfiguration erforderlich ist.

  • MEF ist ein integraler Bestandteil von .NET Framework 4 und überall dort verfügbar, wo .NET Framework verwendet wird, um die Flexibilität, Wartbarkeit und Testbarkeit großer Anwendungen zu verbessern.

  • Sie können MEF in Ihren Clientanwendungen verwenden, unabhängig davon, ob sie Windows Forms, WPF oder eine andere Technologie verwenden, oder in Serveranwendungen, die ASP.NET verwenden.

  • MEF wurde portiert als Microsoft.Composition auch zu .NET Core, aber teilweise.

  • Nur System.Composition ist portiert, und System.ComponentModel.Compositionist noch nicht verfügbar. Dies bedeutet, dass wir nicht über die Kataloge verfügen, mit denen Typen aus Assemblys in einem Verzeichnis geladen werden können.

In diesem Kapitel erfahren Sie nur, wie wir MEF in .NET Core-Anwendungen verwenden können.

Lassen Sie uns ein einfaches Beispiel verstehen, in dem wir MEF in der .NET Core-Konsolenanwendung verwenden. Lassen Sie uns jetzt ein neues .NET Core-Konsolenprojekt erstellen.

Wählen Sie im linken Bereich aus Templates → Visual C# → .NET Core und wählen Sie dann im mittleren Bereich Konsolenanwendung (.NET Core) aus.

Geben Sie den Namen des Projekts in das Feld Name ein und klicken Sie auf OK.

Sobald das Projekt erstellt ist, müssen wir eine Referenz von Microsoft.Composition hinzufügen, damit wir MEF verwenden können. Klicken Sie dazu im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt undManage NuGet Packages…

Suchen nach Microsoft.Composition und klicken Sie auf Install.

Drücke den OK Taste.

Drücke den I Accept Taste.

Nach Abschluss der Installation wird in den Referenzen ein Fehler angezeigt.

Lassen Sie uns die öffnen project.json Datei.

{ 
   "version": "1.0.0-*", 
   "buildOptions": { 
      "emitEntryPoint": true 
   }, 
  
   "dependencies": { 
      "Microsoft.Composition": "1.0.30", 
      "Microsoft.NETCore.App": { 
         "type": "platform", 
         "version": "1.0.1" 
      } 
   }, 
  
   "frameworks": { 
      "netcoreapp1.0": { 
         "imports": "dnxcore50" 
      } 
   } 
}

Sie können sehen, dass die Microsoft.Composition Abhängigkeit wird hinzugefügt, aber das Problem ist, dass dieses Paket nicht kompatibel ist dnxcore50. Also müssen wir importierenportablenet45+win8+wp8+wpa81. Lassen Sie uns jetzt Ihre ersetzenproject.json Datei mit dem folgenden Code.

{ 
   "version": "1.0.0-*", 
   "buildOptions": { 
      "emitEntryPoint": true 
   }, 
   "dependencies": { 
      "Microsoft.Composition": "1.0.30", 
      "Microsoft.NETCore.App": { 
         "type": "platform", 
         "version": "1.0.1"
      } 
   }, 
   "frameworks": { 
      "netcoreapp1.0": { 
         "imports": "portable-net45+win8+wp8+wpa81" 
      } 
   } 
}

Speichern Sie diese Datei und Sie werden sehen, dass der Fehler behoben ist.

Wenn Sie die Referenzen erweitern, wird eine Referenz von angezeigt Microsoft.Composition.

Zuerst müssen wir eine Schnittstelle erstellen, die exportiert werden soll, die Schnittstelle implementieren und die Klasse mit dem Exportattribut dekorieren. Fügen wir nun eine neue Klasse hinzu.

Geben Sie den Namen Ihrer Klasse in das Feld Name ein und klicken Sie auf Add.

Fügen wir den folgenden Code in die PrintData.cs Datei.

using System; 
using System.Collections.Generic; 
using System.Composition; 
using System.Linq; 
using System.Threading.Tasks; 
  
namespace MEFDemo { 
   public interface IPrintData { 
      void Send(string message); 
   } 
   [Export(typeof(IPrintData))] 
   public class PrintData : IPrintData { 
      public void Send(string message) { 
         Console.WriteLine(message); 
      } 
   } 
}

Wie oben erwähnt, sind Kataloge im Microsoft.Composition-Namespace nicht verfügbar. Daher werden alle Typen aus der Assembly mit dem Exportattribut geladen und an das Importattribut angehängt, wie in der Compose-Methode in der Datei Program.cs gezeigt.

using System; 
using System.Collections.Generic; 
using System.Composition; 
using System.Composition.Hosting; 
using System.Linq; 
using System.Reflection; 
using System.Threading.Tasks; 
  
namespace MEFDemo { 
   public class Program { 
      public static void Main(string[] args) { 
         Program p = new Program(); 
         p.Run(); 
      } 
      public void Run() { 
         Compose(); 
         PrintData.Send("Hello,this is MEF demo"); 
      } 
      [Import] 
      public IPrintData PrintData { get; set; } 
      
      private void Compose() { 
         var assemblies = new[] { typeof(Program).GetTypeInfo().Assembly }; 
         var configuration = new ContainerConfiguration() 
            .WithAssembly(typeof(Program).GetTypeInfo().Assembly); 
         
         using (var container = configuration.CreateContainer()) { 
            PrintData = container.GetExport<IPrintData>(); 
         } 
      } 
   } 
}

Lassen Sie uns jetzt Ihre Anwendung ausführen und Sie werden sehen, dass sie ausgeführt wird, indem Sie die PrintData Klasse.

Um mehr über MEF zu erfahren, besuchen Sie die folgende URL https://msdn.microsoft.com/en-us/library/dd460648%28v=vs.110%29.aspx für mehr Details.