Vinicius Quaiato

{tecnologia, conceitos, negócios, idéias, práticas, .NET, ruby, osx, ios e algo mais}

MEF - Criando aplicações plugáveis no .NET 4


No primeiro post sobre MEF expliquei um pouco do conceito geral deste framework presente no .Net 4. Agora vamos criar uma aplicação, simples, para explorar estes conceitos de forma prática.Basicamente o que faremos é utilizar o MEF para criar um plugin de log para uma aplicação simples.A idéia é definirmos uma interface de log, ILogPlugin, e então nossa aplicação utilizar o MEF para utilizar um plugin, ou uma part, que exporte esta interface. Para isso vamos criar um projeto do tipo class library que conterá apenas nossa interface, este será um projeto compartilhado entre a aplicação e o projeto de plugin:projeto shared MEF

public interface ILogPlugin{
void Registrar(string mensagem);
    }

Criaremos agora uma outra solution, com o projeto que implementa um plugin. Adicione uma referência para System.ComponentModel.Composition neste projeto:referencia MEF

projeto plugin MEF

Criaremos um primeiro plugin que faz log em arquivo texto:

[Export(typeof(ILogPlugin))]
public class LogEmArquivoPlugin : ILogPlugin{

public void Registrar(string mensagem)    {        File.AppendAllText("C:\\logTEXTO.txt",mensagem);
    }
}

Notem que na linha 1 estamos utilizando o atributo Export, que faz parte de System.ComponentModel.Composition, ou seja, do MEF. Este atributo é que faz com que esta classe seja reconhecida como uma part exportável, que depois será utilizada pelo MEF para comport uma outra parte que satisfaça um contrato, ou seja, colocar esta nossa classe como um plugin em alguma outra aplicação. Agora vou criar uma aplicação Windows WPF para demonstrar como utilizaremos o MEF para carregar nosso plugin. Este projeto contém apenas uma janela com um botão. Temos ainda uma classe que "simula" uma classe de negócios qualquer:projeto consome plugin MEF

public class ClasseNegocio{    [Import]
private ILogPlugin logger { get;
    set;
    }

public void FazAlgumaCoisa()    {        //faz alguma coisa        logger.Registrar("fiz alguma coisa");
    }
}

Aqui vemos na linha 3 que estamos utilizando o atributo Import. Este atributo define uma dependência nesta parte, ou seja, durante a composição desta parte o container irá preencher esta propriedade com um componente que satisfaça este contrato.No click do botão na nossa aplicação colocaremos o seguinte código:<prelang="csharp" line="1"> private void button1_Click(object sender, RoutedEventArgs e){ var objeto = new ClasseNegocio(); var catalog = new DirectoryCatalog("../../plugins");

catalog.Refresh();

var container = new CompositionContainer(catalog);

container.ComposeParts(objeto);
objeto.FazAlgumaCoisa();
}

Na linha 3 apenas criamos uma instância do nosso objeto de negócios. Na linha 5 estamos criando um DirectoryCatalog do namespace System.ComponentModel.Composition.Hosting, que fará a leitura de um diretório procurando por dlls que contenham partes exportáveis, no nosso caso teremos neste diretório a dll do projeto MEFPlugins que conterá a implementação da classe LogEmArquivoPlugin.na linha 6 chamamos o método Refresh.aspx) no catálogo, este método fará a carga detodas as partes do diretório. Na linha 8 criamos um CompositionContainer passando para ele o catálogo que criamos. O container será responsável por compôr as partes ou seja, ele faz a leitura do catálogo, reconhece os plugins disponíveis, e coloca estes plugins onde for solicitado.Na linha 9 estamos chamando o método ComposeParts do container, passando como parâmetro nosso objeto de negócios, isto fará com que o container componha nosso objeto, ou seja, coloca o plugin de log na propriedade que marcamos como Import.Na linha 11 estamos chamando normalmente o método do nosso objeto de negócios, que deve fazer com que o log seja chamado, e um arquivo de log criado.Com isto quando executamos nossa aplicação e clicamos no botão teremos nosso arquivo sendo criado e gravado no local informado.Este é um primeiro contato com o MEF, nos próximos posts veremos mais funcionalidades e utilizações para este poderoso framework.Dúvidas, críticas e sugestões, mandem e-mail ou deixem comentários, que eu respondo.

Att, Vinicius Quaiato.

Voltar

Fork me on GitHub