Como alguém poderia criar software plugável?


20

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?


Padrões como observador, mediador, Comando ad Chain of Responsibility vêm à mente
Mchl

3
@Mchl: Por favor, poste sua resposta como resposta, não como um comentário.
S.Lott 14/07

Você deve dar uma olhada no Mef e nas informações
Luc Bos

Eu sinto que não está detalhado o suficiente para isso #
1419

@ McL: "não detalhado o suficiente"? Então, por que comentar? É claramente uma resposta. Poste as respostas como respostas.
21711 S.Lott

Respostas:


13

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


1
+1 Ele não respondeu diretamente à pergunta, mas estas são questões importantes a ter em mente
Adriano Carneiro

Eu acredito que estas questões estão cobertas antes que alguém começa a desenvolver o mecanismo de extensibilidade real
Gus

9

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:

  • Você define um contrato (normalmente uma interface) entre o host e a extensão
  • Você precisa de um mecanismo de descoberta que saia e procure por extensões instaladas
  • Você precisa carregar dinamicamente as extensões e informar o host sobre elas

Na prática, ele compartilha muito com a injeção de dependência e o padrão de estratégia.


+1 MEF e System.AddIn são coisas boas para se olhar. Mesmo se você não usá-los, ambos mostram bons conceitos.
RationalGeek

@jkohlhepp - Eu concordo e também sugeriria um mergulho profundo na arquitetura SharpDevelop, porque há muito escrito sobre ela, é de código aberto (é o mesmo que MEF, btw) e é bem projetado.
11118 Scott Whitlock

3

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!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.