Marco de extensibilidad administrado

En este capítulo, analizaremos el marco de extensibilidad administrado (MEF). MEF se puede utilizar para la extensibilidad de complementos de terceros, o puede aportar los beneficios de una arquitectura similar a un complemento de acoplamiento flexible a las aplicaciones habituales.

  • MEF es una biblioteca para crear aplicaciones ligeras y extensibles.

  • Permite a los desarrolladores de aplicaciones descubrir y utilizar extensiones sin necesidad de configuración.

  • MEF es una parte integral de .NET Framework 4 y está disponible dondequiera que se utilice .NET Framework, lo que mejora la flexibilidad, capacidad de mantenimiento y capacidad de prueba de aplicaciones grandes.

  • Puede utilizar MEF en sus aplicaciones cliente, ya sea que utilicen Windows Forms, WPF o cualquier otra tecnología, o en aplicaciones de servidor que utilicen ASP.NET.

  • MEF se ha portado como Microsoft.Composition a .NET Core también, pero parcialmente.

  • Solamente System.Composition es portado, y System.ComponentModel.Compositionaún no está disponible. Esto significa que no tenemos los catálogos que pueden cargar tipos de ensamblajes en un directorio.

En este capítulo, solo aprenderemos cómo podemos usar MEF en la aplicación .NET Core.

Entendamos un ejemplo simple en el que usaremos MEF en la aplicación de consola .NET Core. Creemos ahora un nuevo proyecto de consola .NET Core.

En el panel izquierdo, seleccione Templates → Visual C# → .NET Core y luego, en el panel central, seleccione Aplicación de consola (.NET Core).

Ingrese el nombre del proyecto en el campo Nombre y haga clic en Aceptar.

Una vez creado el proyecto, necesitamos agregar la referencia de Microsoft.Composition para que podamos usar MEF. Para hacerlo, hagamos clic derecho en el proyecto en el Explorador de soluciones yManage NuGet Packages…

Buscar Microsoft.Composition y haga clic en Install.

Haga clic en el OK botón.

Haga clic en el I Accept botón.

Cuando se complete la instalación, encontrará un error en Referencias.

Abramos el project.json archivo.

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

Puedes ver que el Microsoft.Composition Se agrega dependencia, pero el problema es que este paquete no es compatible con dnxcore50. Entonces necesitamos importarportablenet45+win8+wp8+wpa81. Permítanos ahora reemplazar suproject.json archivo con el siguiente código.

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

Guarde este archivo y verá que el error se corrige.

Si expande las Referencias, verá una referencia de Microsoft.Composition.

Primero necesitamos crear una interfaz que se va a exportar e implementar la interfaz y decorar la clase con el atributo de exportación. Agreguemos ahora una nueva clase.

Ingrese el nombre de su clase en el campo Nombre y haga clic en Add.

Agreguemos el siguiente código en el PrintData.cs archivo.

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

Como se mencionó anteriormente, los catálogos no están disponibles en el espacio de nombres Microsoft.Composition. Por lo tanto, cargará todos los tipos del ensamblado con el atributo de exportación y se adjuntará al atributo de importación como se muestra en el método Compose en el archivo 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>(); 
         } 
      } 
   } 
}

Ejecutemos ahora su aplicación y verá que se está ejecutando al crear una instancia del PrintData clase.

Para obtener más información sobre MEF, visite la siguiente URL https://msdn.microsoft.com/en-us/library/dd460648%28v=vs.110%29.aspx para más detalles.