Se você tem um aplicativo de algum tipo e deseja que seus usuários possam escrever plugins para ele, como o aplicativo deve ser projetado?
O que você precisa levar em consideração, quais padrões de design são para isso etc?
Se você tem um aplicativo de algum tipo e deseja que seus usuários possam escrever plugins para ele, como o aplicativo deve ser projetado?
O que você precisa levar em consideração, quais padrões de design são para isso etc?
Respostas:
Depende da sua plataforma, mas algumas coisas gerais a serem lembradas
Controle de versão O que acontece se você atualizar seu aplicativo, todos os plugins antigos se tornam obsoletos (o problema do Firefox)
Isolamento Os plugins podem fazer o que quiserem? Você sempre confia neles? Ou você precisa executá-los em algum tipo de sandbox e solicitar permissões.
Atualizações Como você lida com atualizações de plugins?
Segurança Como você garante o autor de um plug-in, evita a falsificação ou o usuário é induzido a instalar código malicioso. Geralmente resolvido por algum tipo de assinatura de código
Serialização Geralmente, quando você usa algum tipo de isolamento, precisa serializar informações entre diferentes threads ou processos. Como você faz isso com mais eficiência?
Extensibilidade Quais aspectos você precisa estender? Como você maximiza o potencial de plug-ins sem que a API se torne pesada.
Se você está direcionando desenvolvedores de terceiros para plug-ins, eu diria que o mais importante (da minha experiência) é ver a API e as classes do plug-in como completamente diferentes do restante do aplicativo e facilitar o desenvolvimento para que possível. É muito fácil para a arquitetura do aplicativo principal "sangrar" nos plugins, para que os autores dos plugins precisem aprender muito mais do que precisam. Facilite para eles, pense em que tipo de interface e experiência você gostaria como autor de plug-ins.
Outra boa mentalidade é não pensar como "O plug-in fará todas essas coisas (no código), mas" o plug-in precisa fornecer essas informações ". Dessa forma, o aplicativo pode consumir as informações necessárias e realizar o processamento real que simplifica o plugin.
Além disso, em geral, sempre que você pode adotar uma abordagem descritiva (metadados, como xml), em vez de codificar, você tem uma grande vantagem, pois os metadados são mais fáceis de transportar, versão, implantar, proteger e podem ser configurados mais facilmente por terceiros
Eu escrevi este artigo do Code Project sobre o uso do MEF para extensibilidade no .NET. É uma boa introdução.
Existem outras estruturas de extensibilidade para .NET, como a Arquitetura de Suplemento da SharpDevelop , Mono.Addins e System.AddIn .
Para Java, existe a arquitetura de plug-in do Eclipse .
O padrão geral é este:
Na prática, ele compartilha muito com a injeção de dependência e o padrão de estratégia.
Você só precisa fornecer uma interface para os plugins.
Ele deve conter pelo menos um método de ativação (um ponto de entrada), mas você também precisará de coisas como Inicializar etc.
E deve haver a possibilidade de se comunicar com o aplicativo host de maneira semelhante ao registro, por exemplo, para registrar itens de menu. Portanto, devem ser fornecidos registros de itens que são alteráveis / extensíveis para plug-ins.
Além disso, deve haver algum armazenamento acessível para os dados e objetos do aplicativo host, para que os plug-ins possam chamar suas rotinas. Isso pode ser feito facilmente usando um DI-Container como o Unity e deixando os plugins acessá-lo, para que eles possam resolver os serviços de que precisam.
Um Agregador de Eventos também é provavelmente uma boa idéia, portanto, os plug-ins podem lançar eventos e reagir a eventos de outros plug-ins e do aplicativo host de maneira dissociada. Você definitivamente quer um!