2009-08-02 9 views
1

J'ai implémenté un système 'plugin' dans lequel mon application crée des classes qui implémentent une interface lors de l'exécution pour permettre une fonctionnalité enfichable.Utiliser l'activateur est le meilleur moyen de créer des instances de classes avec plusieurs constructeurs?

J'y parviens en utilisant Activator.CreateInstance sur toutes les classes qui implémentent l'interface spécifiée dans l'assembly du plugin.

À l'heure actuelle je n'utilise une implémentation de la classe, et pour cela j'ai deux arguments du constructeur, et ont inclus ceux de l'appel Activator.CreateInstance:

instanceList.Add((Foo)Activator.CreateInstance(_TypeList[typeKey], new object[] { arg1, arg2 })); 

Je sais que cela peut causer problèmes plus tard si une implémentation est ajoutée qui n'utilise pas cette signature constructeur. Quelle est la meilleure situation pour gérer cela.

Dites explicitement via la documentation que les constructeurs doivent utiliser cette signature, puis l'entourer dans un try/catch?

Ou y aurait-il un moyen d'invoquer n'importe quel constructeur d'une classe? En gardant à l'esprit que je devrais faire correspondre les arguments constructeurs en quelque sorte. Ou ... en évitant les arguments constructeurs en plaçant les arguments dans une classe statique en tant que propriétés statiques?

Répondre

1

Premièrement, je refactoriserais le code pour faire abstraction de la construction pour dire une classe d'usine. Ensuite, la stratégie utilisée par l'usine peut décider de la meilleure manière (si différente) et de ce qu'il faut faire en cas d'erreurs - comme un constructeur manquant. Vous pouvez utiliser des génériques pour rendre les interfaces aussi fortement ou faiblement typées que nécessaire.

Je resterais avec Activator cependant. Nous avons fait beaucoup de travail avec ce type de construction et nous a acheté beaucoup de choses, y compris la liaison tardive basée sur les types découverts à l'exécution, singleton, alias de type, sécurité personnalisée, etc.

1

ins pour avoir un constructeur sans paramètres et ajouter une méthode initialize à l'interface, avec quelques arguments généraux.

Il n'existe aucun moyen de connaître les arguments nécessaires à toutes les implémentations possibles du plug-in.

Questions connexes