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
Comments
Anonymous
March 07, 2010
Olá Otávio, Puxa, eu já curtia o trabalho do Brad Abrams pelos posts e artigos sobre o WCF RIA Services. Mas essa introdução sobre MEF dele está muito boa! Leitura Obrigatória! Simple Introduction to Extensible Applications with the Managed Extensions Framework http://blogs.msdn.com/brada/archive/2008/09/29/simple-introduction-to-composite-applications-with-the-managed-extensions-framework.aspx []s Waldemir.Anonymous
April 26, 2011
Olá Otávio, Seu blog é referência para arquitetos, gostaria que fosse inserido mais informações sobre customização e elaboração de frameworks para aplicações corporativas. Tem algum material para indicação de estudo ? []'s MayconAnonymous
April 30, 2011
Maycon, prometo falar mais deste assunto. Enquanto isto, aqui vai a minha primeira recomendação: www.amazon.com/.../ref=sr_1_1 É em inglês, mas muito útil e instrutivo. Abraços Otavio