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.