J'essaie de trouver une architecture pour les plugins, mais je n'ai jamais travaillé avec ça. Essentiellement, mon programme prend en charge plusieurs backends de base de données, mais un seul à la fois.
Mon idée était maintenant de créer une nouvelle Assemblée (".DataCore") qui contient toutes mes interfaces de référentiel (IFooRepository, IBarRepository) et une interface IDataPlugin. Ensuite, les plugins doivent implémenter toutes ces interfaces.
L'utilisateur spécifie le nom de l'assemblage souhaité dans le fichier app.config. Mon programme appelle alors une fonction dans l'assemblage DataCore qui, à son tour, utilise Reflection pour charger l'assemblage souhaité. À l'aide de la réflexion, je recherche ensuite la classe qui implémente IDataPlugin et j'appelle une fonction Initialize(), qui contient toutes les liaisons DI pour Ninject.
Mon architecture ressemble donc à ça :
MonProgramme => nouveau DataCoreLoader(string assemblyName) => DesiredDataPlugin.Initialize()
Je ne suis pas sûr que ce soit la bonne méthode, et si je dois vraiment l'implémenter moi-même en utilisant la réflexion. Je suppose qu'il existe des cadres existants ? J'ai regardé brièvement MEF, mais je ne sais pas si cela pourrait m'aider ?
Les raisons pour lesquelles je veux que mes plugins aient au moins une classe découvrable sont a) Je veux vérifier un numéro de ProtocolVersion par rapport à celui que mon programme attend, pour détecter les plugins périmés et b) Mon outil de configuration devrait offrir une liste de tous les DataPlugins avec quelques métadonnées comme l'auteur ou la description.
Il ne sera jamais nécessaire de charger plus d'un plugin Data en même temps, mais je cherche quelque chose qui le permette dans d'autres domaines (dans une autre partie de l'application, je veux utiliser des plugins qui s'abonnent aux événements que mon application émet).