Infrastructure d'extensibilité gérée

Dans ce chapitre, nous aborderons le Managed Extensibility Framework (MEF). MEF peut être utilisé pour l'extensibilité de plug-in tiers, ou il peut apporter les avantages d'une architecture de type plug-in faiblement couplée aux applications classiques.

  • MEF est une bibliothèque pour créer des applications légères et extensibles.

  • Il permet aux développeurs d'applications de découvrir et d'utiliser des extensions sans aucune configuration requise.

  • MEF fait partie intégrante du .NET Framework 4 et est disponible partout où le .NET Framework est utilisé, ce qui améliore la flexibilité, la maintenabilité et la testabilité des grandes applications.

  • Vous pouvez utiliser MEF dans vos applications clientes, qu'elles utilisent Windows Forms, WPF ou toute autre technologie, ou dans les applications serveur qui utilisent ASP.NET.

  • MEF a été porté comme Microsoft.Composition à .NET Core également mais partiellement.

  • Seulement System.Composition est porté, et System.ComponentModel.Compositionn'est pas encore disponible. Cela signifie que nous n'avons pas les catalogues qui peuvent charger des types à partir d'assemblys dans un répertoire.

Dans ce chapitre, nous apprendrons uniquement comment utiliser MEF dans l'application .NET Core.

Laissez-nous comprendre un exemple simple dans lequel nous utiliserons MEF dans l'application console .NET Core. Créons maintenant un nouveau projet de console .NET Core.

Dans le volet gauche, sélectionnez Templates → Visual C# → .NET Core, puis dans le volet central, sélectionnez Application console (.NET Core).

Entrez le nom du projet dans le champ Nom et cliquez sur OK.

Une fois le projet créé, nous devons ajouter une référence de Microsoft.Composition afin de pouvoir utiliser MEF. Pour ce faire, faites un clic droit sur le projet dans l'Explorateur de solutions etManage NuGet Packages…

Rechercher Microsoft.Composition et cliquez Install.

Clique le OK bouton.

Clique le I Accept bouton.

Une fois l'installation terminée, vous trouverez une erreur dans les références.

Ouvrons le project.json fichier.

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

Vous pouvez voir que le Microsoft.Composition la dépendance est ajoutée, mais le problème est que ce package n'est pas compatible avec dnxcore50. Nous devons donc importerportablenet45+win8+wp8+wpa81. Laissez-nous maintenant remplacer votreproject.json fichier avec le code suivant.

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

Enregistrez ce fichier et vous verrez que l'erreur est corrigée.

Si vous développez les références, vous verrez une référence de Microsoft.Composition.

Nous devons d'abord créer une interface qui doit être exportée et implémenter l'interface et décorer la classe avec l'attribut d'exportation. Ajoutons maintenant une nouvelle classe.

Entrez le nom de votre classe dans le champ Nom et cliquez sur Add.

Ajoutons le code suivant dans le PrintData.cs fichier.

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

Comme mentionné ci-dessus, les catalogues ne sont pas disponibles dans l'espace de noms Microsoft.Composition. Ainsi, il chargera tous les types de l'assembly avec l'attribut d'exportation et s'attachera à l'attribut d'importation comme indiqué dans la méthode Compose dans le fichier 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>(); 
         } 
      } 
   } 
}

Lançons maintenant votre application et vous verrez qu'elle s'exécute en instanciant le PrintData classe.

Pour en savoir plus sur MEF, visitons l'URL suivante https://msdn.microsoft.com/en-us/library/dd460648%28v=vs.110%29.aspx pour plus de détails.