MEF como IoC/DI Container

O .NET 4 vem com uma biblioteca chamada MEF – Managed Extensibility Framework que, de acordo com sua definição, ajuda os desenvolvedores a construir aplicações que suas partes são descobertas e construídas em tempo de execução. Na prática, são aplicações com partes “plugáveis”, através (obviamente) de plugins.

Só que é possível, sem muitas dificuldades, utilizar o MEF como um IoC/DI container, com o diferencial que não existe a obrigação de haver um artefato estático que faça o mapeamento dos tipos (por exemplo, um arquivo XML ou uma classe) como a maioria dos outros containers. Além disso, para utilizá-lo, basta importar o assembly System.ComponentModel.Composition do .NET, sem a necessidade de instalar uma biblioteca externa.

Para utilizar o MEF, você precisa basicamente de quatro elementos: Um contrato, um import, um export e um catálogo.

– O contrato é o ponto comum entre um import e um export, e indica a funcionalidade esperada de uma parte. Normalmente é definido através de uma interface, mas pode ser um tipo abstrato, por exemplo.
– O import é onde a parte será plugada, que pode ser uma propriedade, uma coleção (no caso de se esperar várias implementações do mesmo contrato) ou construtor de uma classe. É definido através do atributo [Import] ou [ImportMany]
– O export é o plugin (a parte que será plugada) que contém a implementação da funcionalidade definida pelo contrato. É definido pelo atributo [Export].
– O catálogo contém os tipos exportados e que podem ser utilizados para satisfazer Imports de cada contrato. O MEF vem com quatro tipos de catálogos: DirectoryCatalog (busca os tipos exportados nos assemblies em um determinado diretório – p.e. d:\app\plugins\), AssemblyCatalog (todos os tipos de um assembly), TypeCatalog (você especifica explicitamente quais tipos compoem o catálogo) e AggregateCatalog (permite combinar vários catálogos). Existem diversos outros tipos de catálogos que podem ser encontrados na internet, inclusive alguns que usam mapeamento XML. Os catálogos são utilizados pelo container no MEF (CompositionContainer) para criação dos tipos.

Para quem se interessar, o link abaixo leva a uma série de posts detalhando melhor como utilizar a biblioteca:
http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/01/09/mef-for-beginner-toc.aspx

O MEF também tem uma mecânica interessante para lidar com o tempo de vida os objetos. Resumidamente, você pode especificar se a instância é compartilhada (singleton) ou exclusiva no momento da importação ou na exportação dos tipos. Neste link, um dos desenvolvedores da biblioteca (que por sinal é o criador do Castle) explica como trabalhar com esta questão.

Anúncios