Extensibilidade via AddIns, MEF e/ou Unity Application Block

Creio que foi Douglas McIlroy quem primeiro falou em componentes de software ainda em 1968 (o artigo pode ser visto em https://www.cs.dartmouth.edu/~doug/components.txt). Ele, como outros, naquela época, reclamava da falta de maturidade na produção de software e sugeria a produção de componentes de software de maneira análoga à que já acontecia em outras engenharias.

Desde então várias foram as propostas: sistemas modulares, sistemas orientados a objetos, componentes padrões (VBX, OCX, Beans, etc.), aspectos, patterns e assim por diante.

Um subproduto destes desenvolvimentos são os frameworks de extensibilidade. Eles têm como objetivo tornar mais simples a extensão ou modificação futura de um aplicativo existente.

Existem dois mecanismos já embutidos no .Net Framework 4.0 para ajudar a extensibilidade:

  • System.AddIn: Tem como objetivo adicionar um novo módulo externo, minimizando o impacto na aplicação hospedeira. Você encontra neste framework os mecanismos de descoberta (onde estão os add-ins?), gerência do tempo de vida, isolamento/segurança (implementados através do mecanismo de Sandbox, e o que também permite duas versões de um mesmo AddIn lado-a-lado) e comunicação entre o aplicativo hospedeiro e os addins.

Um bom artigo sobre este assunto pode ser visto em https://msdn.microsoft.com/en-us/magazine/cc163476.aspx.

Se você preferir um walkthrough aqui está um bom: https://msdn.microsoft.com/en-us/library/bb909849.aspx;

  • MEF (Managed Extensibility Framework) : Tem como objetivo descobrir componentes externos e todas suas dependências, carregando-os no momento de execução quando necessário (isto é, possibilitando o “lazy loading”) dentro do contexto do hospedeiro (sem Sandbox!). O MEF faz o discovery a partir de um repositório (por exemplo um diretório com dll’s a serem carregadas) e usa os metadados dos assemblies para calcular as dependências e trazer para o tempo de execução só o que for necessário. Com o MEF, você pode pensar em distribuir o novo código para um subsistema (como, por exemplo, uma nova versão para logging) sem ter que re-compilar e redistribuir todo o aplicativo.

Recomendo este post do Brad Adams para quem quiser entender rapidamente o quanto é fácil usar o MEF (se quiser rodar, você vai precisar ajustar o código para que ele funcione no .Net Framework 4.0, já que no tempo do post ele estava em beta – este artigo pode ajudá-lo a conhecer as principais mudanças de nomes de métodos e argumentos que ocorreram).

Pergunta frequente: e o Unity Application Block? Ele vai continuar, embora o MEF já cubra várias funcionalidades que ele provê. Na sua próxima versão o prometido é que ele usará o MEF para estendê-lo com outras funcionalidades. Como sempre, a função de um App Block do grupo de Patterns&Practices é cobrir eventuais espaços não tratados pelo .Net Framework até que este coloque, de forma definitiva, os mecanismos no famework.

Abraços