Je suis confronté à un problème et je cherche le meilleur concept/théorie de solution.Gestion des modules et des classes (liaison dynamique)
J'ai un système qui a besoin d'utiliser des objets. Chaque objet que le système utilise possède une interface connue, probablement implémentée en tant que classe abstraite. Les interfaces sont connues au moment de la construction et ne changeront pas. La mise en œuvre exacte à utiliser variera et je n'ai aucune idée à l'avance du module qui va le fournir. La seule garantie est qu'ils fourniront l'interface. Le nom de la classe et le module (DLL) proviennent d'un fichier de configuration ou peuvent être modifiés par programmation.
Maintenant, j'ai tout cela mis en place au moment en utilisant un système relativement simple, mettre en place quelque chose comme si (réécrite pseudo-code, juste pour montrer les bases):
struct ClassID
{
Module * module;
int number;
};
class Module
{
HMODULE module;
function<void * (int)> * createfunc;
static Module * Load(String filename);
IObject * CreateClass(int number)
{
return createfunc(number);
}
};
class ModuleManager
{
bool LoadModule(String filename);
IObject * CreateClass(String classname)
{
ClassID class = AvailableClasses.find(classname);
return class.module->CreateObject(class.number);
}
vector<Module*> LoadedModules;
map<String, ClassID> AvailableClasses;
};
Les modules ont quelques fonctions exportées pour donner le nombre de classes qu'elles fournissent et les noms/identifiants de celles-ci, qui sont ensuite stockées. Toutes les classes dérivent de IObject
, qui a un destructeur virtuel, stocke le module source et a quelques méthodes pour obtenir l'ID de classe, quelle interface il implémente et tel.
Le seul problème avec ceci est que chaque module doit être chargé manuellement quelque part (répertorié dans le fichier de configuration, pour le moment). Je voudrais éviter de le faire explicitement (en dehors du , à l'intérieur que je ne suis pas vraiment concerné par la façon dont il est implémenté).
Je voudrais avoir un système similaire sans avoir à gérer le chargement des modules, juste créer un objet et (une fois que tout est configuré) il apparaît comme par magie.
Je crois que c'est similaire à ce que COM est censé faire, à certains égards. J'ai regardé brièvement dans le système COM, mais il semble être excessif au-delà de la croyance. J'ai seulement besoin des classes connues dans mon système et je n'ai pas besoin de toutes les autres fonctionnalités qu'il gère, juste des implémentations d'interfaces venant de quelque part. Mon autre idée est d'utiliser le registre et garder une clé avec toutes les classes connues/enregistrées et leurs modules et numéros source, donc je peux juste les rechercher et il apparaîtra que Manager::CreateClass
trouve et rend l'objet magiquement. Cela semble être une solution viable, mais je ne sais pas si c'est optimal ou si je réinvente quelque chose. Donc, après tout cela, ma question est: Comment gérer cela? Existe-t-il une technologie existante, sinon, comment la configurer au mieux? Y a-t-il des pièges que je devrais surveiller?
Certaines des fonctionnalités offertes par COM, comme ne pas se soucier des compilateurs ou des runtimes et je crois que l'utilisation de modules C# est très agréable, mais je n'ai pas encore trouvé d'informations sur la manière de faire fonctionner COM. Ce que j'ai pu trouver lors de la création de nouvelles interfaces/objets implique beaucoup de définition et de code standard. Avez-vous des suggestions sur de bons documents à regarder? – ssube
Je pense que je regarderais ATL pour créer des objets COM. Je lirais aussi le livre de Don Box, Essential COM. En fait, vous n'avez besoin que des premiers chapitres. Ce n'est vraiment pas si effrayant! –
Le livre a une bonne explication de la façon dont les choses fonctionnent, et certains docs MSDN font pour de beaux tutoriels. Je vais essayer et voir si ça marche. Merci pour les suggestions. :) – ssube