2010-06-22 1 views
4

Je travaille sur un nouveau produit qui aura finalement différentes fonctionnalités construites autour de lui en fonction des besoins individuels des clients. Par conséquent, je voudrais mettre en application la capacité d'avoir des plugins que je peux déployer et l'application principale détectera les plugins et changera en conséquence. Le kicker est que le produit visera probablement les versions antérieures de .Net qui ne supportent pas System.Addin ou la possibilité de MEF. Cela dit, quels modèles/méthodes de programmation se prêtent bien au support des plugins en C#? Je voudrais rester à l'écart des cadres de tiers, bien que je sois libre d'en nommer un. Idéalement, j'aimerais avoir la possibilité de déposer dans un plugin s'il modifie le menu principal et/ou un menu contextuel et/ou de fournir un nouveau service. En Java, cela a été bien géré via les points d'extension. Suis-je fondamentalement coincé pour écrire mon propre gestionnaire de point d'extension?Modèle/Méthode pour la fonctionnalité du plugin C#

+0

Pourquoi soutenir ces premières versions? –

+0

Déploiement Gouvernement/Militaire, ils ne supportent pas les dernières/plus grandes versions. – Matthew

Répondre

2

Vous souhaitez examiner l'espace de noms System.Reflection pour vous aider dans cette tâche. Une approche serait de créer une interface commune pour vos classes de plugin (lookup strategy pattern) et ensuite utiliser la réflexion au moment de l'exécution pour regarder toutes les DLL dans un dossier donné (peut-être où l'exe est ou un dossier complémentaire spécial) en prenant note de la classes qui contiennent cette interface particulière. En particulier garder un dictionnaire des types (ceux avec votre interface spéciale qui le désigne comme une classe plugin). Une fois que vous avez une liste de ces types qui contiennent l'interface les désignant comme un plugin, vous pouvez les instancier dynamiquement à volonté en utilisant la classe System.Activator. Effectuez la vérification initiale des classes de compléments au démarrage de l'application, puis utilisez une fabrique abstraite pour charger le plug-in en fonction du type ou d'autres métadonnées pouvant être attribuées à la classe à l'aide des attributs .net.

Si vous avez besoin d'exemples de code spécifiques que je peux faire pour vous, mais vous devriez prendre le temps de se familiariser avec System.Reflection, System.Activator et .net attributs si vous avez l'intention de construire une solide et flexible système de complément.

Profitez-en!

1

Je suis une personne Java, mais étant donné que votre question est liée à des modèles de conception de logiciels ...

Le Strategy Pattern est probablement ce qui va vous aider ici, à un niveau très abstrait. Donc, peut-être que votre application de base a un ensemble très basique de «stratégies» qu'elle utilise pour fonctionner ... plutôt que, disons, créer une barre de menu, vous appelez un objet de stratégie de barre de menu simple pour le créer pour vous. Ensuite, fournissez des méthodes pour échanger des stratégies (donc, déployer un plugin consiste essentiellement à appeler un tas de méthodes setStrategy() sur les objets affectés, ou comme vous le souhaitez). Le plugin fournirait des stratégies alternatives. En ce qui concerne le chargement en cours d'exécution des classes de plug-ins, je ne connais pas assez C# pour répondre à cette question.

Comme je l'ai déjà dit, tout cela est très abstrait. Essayez d'éviter autant que possible la réflexion - bien que cela soit parfois nécessaire, il existe des désavantages au niveau de la performance, de la sécurité et de la conception liés à l'utilisation de la réflexion.

Espérons que ça aide!

0

Presque toute architecture de "plug-in" sera basée sur une variante d'un pattern Builder - à peu près par définition.