Pergunta

A extensibilidade Framework Managed (MEF) e gerenciados Framework AddIn (MAF, aka System.AddIn) parecem realizar tarefas muito semelhantes. De acordo com esta pergunta Stack Overflow, Is MEF um substituto para System.AddIn? , você pode até usar os dois ao mesmo tempo.

Quando você optar por usar um contra o outro? Sob que circunstâncias você optar por usar os dois juntos?

Foi útil?

Solução

Andei avaliando estas opções e aqui é a conclusão que vim.

MAF é uma estrutura addon verdade. Você pode separar seus complementos completamente, mesmo executá-los dentro de um domínio de aplicativo separado para que, se um addon acidentes, não vai derrubar sua aplicação. Ele também fornece uma maneira muito completa da dissociação entre os complementos de acordo com qualquer coisa, mas o contrato que lhes dão. Na verdade, você pode versionize seus adaptadores de contrato para fornecer compatibilidade com versões anteriores para complementos de idade, enquanto você estiver atualizando a principal App. Enquanto isso soa muito bem, ele vem com um preço muito alto você tem que pagar, a fim de AppDomains cruzadas. Você paga esse preço em velocidade e também na flexibilidade dos tipos que você pode enviar e para trás.

MEF é mais como injeção de dependência com alguns benefícios adicionais, tais como descoberta e ... (um desenho em branco em um presente). O grau de isolamento que tem MAF não está presente no MEF. Eles são dois quadros diferentes para duas coisas diferentes.

Outras dicas

O que Danielg disse é bom. Eu acrescentaria:

Se você assistir os vídeos sobre System.Addins, eles estão falando claramente sobre projetos muito grandes. Ele fala sobre um equipe gestão do aplicativo host, outra equipe gestão de cada suplemento, e um terceiro equipe gestão do contrato e do gasoduto. Com base nisso, eu acho System.Addins é claramente para aplicações maiores. Estou pensando aplicações como sistemas de ERP como SAP (talvez não tão grande, mas você começa a idéia). Se você assistiu os vídeos que você pode dizer que a quantidade de trabalho para usar System.Addins é muito grande. Ele iria funcionar bem se você tivesse um monte de empresas de programação 3rd party add-ins para o seu sistema e você não pode quebrar qualquer um desses add-in contratos sob pena de morte.

Por outro lado, MEF parece partilhar mais semelhanças com a arquitetura add-in esquema, o Eclipse plug-in do SharpDevelop ou Mono.Addins. É muito mais fácil de entender do que System.Addins e acredito que ele seja muito mais flexível. As coisas que você perde é que você não obter o isolamento AppDomain ou contratos de versão fortes out-of-the-box com MEF. pontos fortes da MEF são que você pode estruturar seu aplicativo inteiro como uma composição de peças, assim você pode enviar seu produto em diferentes configurações para diferentes clientes, e se o cliente compra um novo recurso, basta soltar a parte para esse recurso em seu diretório de instalação e a aplicação vê-lo e executá-lo. Além disso, facilita o teste. Você pode instanciar o objeto que você deseja testar e alimentá-lo com objetos fictícios para todas as suas dependências, mas quando ele é executado como uma aplicação de composto, o processo de composição conecta automaticamente todos os objetos reais juntos.

O ponto mais importante que eu gostaria de mencionar é que mesmo que System.Addins está no quadro já, não vejo muita evidência de pessoas a usá-lo, mas MEF é apenas sentado lá no CodePlex supostamente para ser incluído no .NET 4, e as pessoas já estão começando a construir muitas aplicações com ele (eu incluído). Acho que lhe diz algo sobre as duas estruturas.

Tendo desenvolvido e enviado um pedido de MAF. Meus pontos de vista sobre MAF são um pouco cansado.

MAF é um sistema "dissociado" ou sistema "fracamente acoplado" na pior das hipóteses. MEF é "fracamente casal" sistema de sistema ou "acoplado" na melhor das hipóteses.

benefícios MAF que percebemos usando MAF são:

  1. A instalação nova ou atualizar componentes existentes enquanto o aplicativo está sendo executado. O suplemento pode ser atualizado enquanto o aplicativo estava funcionando e as atualizações aparecem para o usuário sem problemas. Você tem que ter AppDomains para isso.

  2. Licenciamento baseado em componentes adquiridos. Poderíamos controlar quais suplementos foram carregados pelo papel do usuário e as permissões e se o suplemento foi licenciada para uso.

  3. O rápido desenvolvimento (time-to-market mais rápido). Os ataques de desenvolvimento AddIn perfeitamente com Agile methodolgy, a equipe de desenvolvimento desenvolveu um suplemento em um momento sem ter que também desenvolvem a peça integração com o resto da aplicação.

  4. Melhoria da QA (somente QA um componente de cada vez). QA poderia, então, testar e defeitos problema para um único bit de funcionalidade. Os casos de teste eram mais fáceis de desenvolver e implementar.

  5. Implantação (componentes add como eles são desenvolvidos e lançados e eles “trabalho justo”). A implantação é apenas uma questão de fazer um suplemento e instalar o arquivo. Há outras considerações eram necessários!

  6. Os novos componentes trabalhou com componentes antigos. AddIn que foram desenvolvidos no início continuou a trabalhar. Novas AddIns encaixar no aplicativo perfeitamente

Em minha opinião, as duas tecnologias realmente alvo muito diferentes casos de uso.

MEF é tipicamente melhor em um cenário de injeção de dependência pura, onde a pessoa ou grupo oferecer a solução integrada final é montar tudo e garantindo a integridade geral, mas tem uma necessidade de ter diferentes implementações de recursos importantes.

MAF é para um cenário em que alguém / grupo está desenvolvendo uma plataforma ou de acolhimento e outros grupos irá adicionar capacidades depois do fato e de uma forma que não esteja sob o controle do grupo de acolhimento. Neste cenário, a necessidade é para mecanismos mais elaborados para "proteger" o anfitrião de add-ins maliciosos (ou add-ins proteger de si).

Uma terceira tecnologia semelhante-in-padrão é todo o esquema ProviderBase. Isso também permite a substituição de uma capacidade, mas seu objetivo é realmente o cenário onde o anfitrião / app absolutamente precisa de uma capacidade e a necessidade é realmente para especificar diferentes implementações via configuração.

Eu encontrei este longo artigo discutindo tanto MAF e MEF. http://emcpadden.wordpress.com/2008/ 07/12 / gerido pelo extensibilidade-framework-e-outros /

Além dos pontos feitos pelas outras respostas, soa como se uma das principais diferenças entre MEF e MAF é que a extensibilidade Framework Managed permitiria uma parte combináveis ??que depender de outro. Ele deixaria um plug-in depender de outro plug-in, por exemplo.

A extensibilidade Framework Managed também realmente não faz distinções entre o host eo add-in, como o System.AddIn faz. Tanto quanto MEF está em causa, eles são todas as partes apenas combináveis.

Na minha opinião, a melhor maneira de descobrir as diferenças é algumas hands-on código. Eu encontrei dois MSDN instruções passo a passo, ambos com um exemplo da calculadora para que você possa facilmente comparar suas implementações:

MEF: exemplo calculadora simples usando peças MEF
( M anaged E xtensibility F UADRO)

  • mostra como construir-se uma calculadora simples usando a tecnologia MEF. Não mostra como carregar dlls externas. (Mas você pode simplesmente modificar o exemplo usando catalog.Catalogs.Add(new DirectoryCatalog("Plugins", "*.dll")); em vez de usar catalog.Catalogs.Add(new AssemblyCatalog(typeof(Program).Assembly)); e extrair o código calculadora e contrato para projetos DLL separadas.)
  • MEF não necessidade de ter uma estrutura de diretório específico, é simples e fácil de usar, mesmo para pequenos projetos. É trabalha com atributos, para declarar o que é exportado, o que é fácil de ler e entender. Exemplo: [Export(typeof(IOperation))] [ExportMetadata("Symbol", '+')] class Add: IOperation { public int Operate(int left, int right) { return left + right; } }

  • MEF não lida automaticamente com versões

MAF: calculadora simples com V1 e V2 versão MAF plugins
( M anaged A ddin F UADRO)

  • mostra como construir a calculadora usando um plugin V1 e depois como passar para um plugin V2, mantendo compatibilidade com versões anteriores ( Nota: você pode encontrar a versão V2 do plugin < a href = "https://msdn.microsoft.com/en-us/library/vstudio/bb384194(v=vs.100).aspx" rel = "noreferrer"> aqui , o link no original artigo é quebrado)
  • MAF Enforces a específica estrutura de diretório, e ele precisa de um monte de código clichê para fazer o trabalho, portanto, eu não recomendo para pequenos projetos. Exemplo:
    Pipeline
      AddIns
        CalcV1
        CalcV2
      AddInSideAdapters
      AddInViews
      Contracts
      HostSideAdapters
    

Ambos MEF e MAF estão incluídos no 4.x. .NET Framework Se você comparar os dois exemplos que você vai notar que os plugins MAF tem muito mais complexidade em comparação com o quadro MEF - então você precisa pensar com cuidado quando usar cada um desses quadros

.

MAF e MEF tanto pode usar AppDomains e ambos podem carregar / descarregar dll em tempo de execução. No entanto, as diferenças que tenho encontrado são: AddIns MAF são dissociados, componentes MEF são soltos acoplada; MAF "ativa" (nova instância), enquanto MEF faz casos por padrão.

Com MEF você pode usar genéricos para fazer GenericHost para qualquer contrato. Isto significa que a carga MEF / descarga e gestão componente pode estar em uma biblioteca comum e usado genericamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top