Framework di estensibilità gestita

In questo capitolo, discuteremo del Managed Extensibility Framework (MEF). MEF può essere utilizzato per estensibilità di plug-in di terze parti oppure può portare i vantaggi di un'architettura simile a plug-in a connessione libera alle normali applicazioni.

  • MEF è una libreria per creare applicazioni leggere ed estensibili.

  • Consente agli sviluppatori di applicazioni di scoprire e utilizzare estensioni senza necessità di configurazione.

  • MEF è parte integrante di .NET Framework 4 ed è disponibile ovunque venga utilizzato .NET Framework che migliora la flessibilità, la manutenibilità e la testabilità di applicazioni di grandi dimensioni.

  • È possibile utilizzare MEF nelle applicazioni client, indipendentemente dal fatto che utilizzino Windows Form, WPF o qualsiasi altra tecnologia o nelle applicazioni server che utilizzano ASP.NET.

  • MEF è stato convertito come Microsoft.Composition anche a .NET Core, ma parzialmente.

  • Solo System.Composition è portato, e System.ComponentModel.Compositionnon è ancora disponibile. Ciò significa che non abbiamo i cataloghi che possono caricare i tipi dagli assembly in una directory.

In questo capitolo, impareremo solo come utilizzare MEF nell'applicazione .NET Core.

Comprendiamo un semplice esempio in cui useremo MEF nell'applicazione console .NET Core. Creiamo ora un nuovo progetto console .NET Core.

Nel riquadro sinistro selezionare Templates → Visual C# → .NET Core e quindi nel riquadro centrale selezionare Applicazione console (.NET Core).

Immettere il nome del progetto nel campo Nome e fare clic su OK.

Una volta creato il progetto, dobbiamo aggiungere un riferimento a Microsoft.Composition in modo da poter utilizzare MEF. A tale scopo, fare clic con il pulsante destro del mouse sul progetto in Esplora soluzioni eManage NuGet Packages…

Cercare Microsoft.Composition e fare clic Install.

Clicca il OK pulsante.

Clicca il I Accept pulsante.

Al termine dell'installazione, troverai un errore in Riferimenti.

Apriamo il file project.json file.

{ 
   "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" 
      } 
   } 
}

Puoi vedere che il file Microsoft.Composition viene aggiunta la dipendenza, ma il problema è che questo pacchetto non è compatibile con dnxcore50. Quindi dobbiamo importareportablenet45+win8+wp8+wpa81. Adesso sostituiamo il tuo fileproject.json file con il codice seguente.

{ 
   "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" 
      } 
   } 
}

Salva questo file e vedrai che l'errore è stato corretto.

Se espandi i riferimenti, vedrai un riferimento di Microsoft.Composition.

Per prima cosa dobbiamo creare un'interfaccia che deve essere esportata e implementare l'interfaccia e decorare la classe con l'attributo export. Aggiungiamo ora una nuova classe.

Immettere il nome per la classe nel campo Nome e fare clic Add.

Aggiungiamo il codice seguente nel file PrintData.cs file.

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); 
      } 
   } 
}

Come accennato in precedenza, i cataloghi non sono disponibili nello spazio dei nomi Microsoft.Composition. Quindi, caricherà tutti i tipi dall'Assembly con l'attributo di esportazione e si collegherà all'attributo di importazione come mostrato nel metodo Compose nel file Program.cs.

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>(); 
         } 
      } 
   } 
}

Eseguiamo ora la tua applicazione e vedrai che è in esecuzione istanziando il file PrintData classe.

Per saperne di più sul MEF, visita il seguente URL https://msdn.microsoft.com/en-us/library/dd460648%28v=vs.110%29.aspx per ulteriori dettagli.