Estrutura de extensibilidade gerenciada

Neste capítulo, discutiremos o Managed Extensibility Framework (MEF). MEF pode ser usado para extensibilidade de plug-in de terceiros ou pode trazer os benefícios de uma arquitetura semelhante a plug-in fracamente acoplada para aplicativos regulares.

  • MEF é uma biblioteca para a criação de aplicativos leves e extensíveis.

  • Ele permite que os desenvolvedores de aplicativos descubram e usem extensões sem a necessidade de configuração.

  • O MEF é parte integrante do .NET Framework 4 e está disponível onde quer que o .NET Framework seja usado, o que melhora a flexibilidade, manutenção e testabilidade de grandes aplicativos.

  • Você pode usar o MEF em seus aplicativos cliente, sejam eles Windows Forms, WPF ou qualquer outra tecnologia, ou em aplicativos de servidor que usam ASP.NET.

  • MEF foi portado como Microsoft.Composition para o .NET Core também, mas parcialmente.

  • Somente System.Composition é portado, e System.ComponentModel.Compositionainda não está disponível. Isso significa que não temos os catálogos que podem carregar tipos de assemblies em um diretório.

Neste capítulo, aprenderemos apenas como podemos usar o MEF no aplicativo .NET Core.

Vamos entender um exemplo simples em que usaremos o MEF no aplicativo de console .NET Core. Vamos agora criar um novo projeto de console do .NET Core.

No painel esquerdo, selecione Templates → Visual C# → .NET Core e, em seguida, no painel do meio, selecione Aplicativo de console (.NET Core).

Insira o nome do projeto no campo Nome e clique em OK.

Uma vez que o projeto é criado, precisamos adicionar a referência de Microsoft.Composition para que possamos usar o MEF. Para fazer isso, vamos clicar com o botão direito no projeto no Solution Explorer eManage NuGet Packages…

Procurar por Microsoft.Composition e clique Install.

Clique no OK botão.

Clique no I Accept botão.

Quando a instalação for concluída, você encontrará um erro nas Referências.

Vamos abrir o project.json Arquivo.

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

Você pode ver que o Microsoft.Composition dependência é adicionada, mas o problema é que este pacote não é compatível com dnxcore50. Então, precisamos importarportablenet45+win8+wp8+wpa81. Vamos agora substituir o seuproject.json arquivo com o seguinte 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" 
      } 
   } 
}

Salve este arquivo e você verá que o erro foi corrigido.

Se você expandir as referências, verá uma referência de Microsoft.Composition.

Primeiro, precisamos criar uma interface que deve ser exportada e implementar a interface e decorar a classe com o atributo export. Vamos agora adicionar uma nova classe.

Digite o nome da sua turma no campo Nome e clique em Add.

Vamos adicionar o seguinte código no PrintData.cs Arquivo.

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

Conforme mencionado acima, Catálogos não estão disponíveis no namespace Microsoft.Composition. Portanto, ele carregará todos os tipos do Assembly com atributo de exportação e anexará ao atributo de importação conforme mostrado no método Compose no arquivo 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>(); 
         } 
      } 
   } 
}

Vamos agora executar o seu aplicativo e você verá que ele está sendo executado instanciando o PrintData classe.

Para saber mais sobre o MEF, visite o seguinte URL https://msdn.microsoft.com/en-us/library/dd460648%28v=vs.110%29.aspx para mais detalhes.