2 votes

Question sur l'architecture des plugins et l'injection de dépendances

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).

2voto

user22290 Points 949

C'est une façon raisonnable d'implémenter les plugins.

2voto

arbiter Points 5503

Si vous spécifiez l'assemblage souhaité dans app.config, pourquoi ne pas spécifier le nom complet de la classe dans ce fichier ? Ainsi, au lieu de

<add key="dummy" value="DummyAssembly" />

Vous pouvez écrire

<add key="dummyPlugin" value="DummyNamespace.DummyClass, DummyAssembly" />

Ensuite vous pouvez instancier votre plugin en utilisant la classe Activator (Activator.CreateInstane)

Type DummyType = Type.GetType(DummyTypeValue);
Activator.CreateInstance(DummyType);

Lorsque vous avez votre type, vous pouvez vérifier n'importe quel attribut (auteur, description, version, etc.), ou l'instancier et vérifier ses propriétés avant de l'utiliser.

1voto

Steven Sudit Points 13793

Je suis d'accord pour dire qu'il s'agit d'une façon raisonnable d'implémenter les plug-ins, bien qu'elle puisse probablement être améliorée de quelques façons. Cependant, je ne suis pas sûr que vous ayez besoin d'une architecture de plug-in pour cela, car .NET en a déjà une. Jetez un coup d'oeil à DbProviderFactory.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X