2010-03-23 7 views
2

Je voudrais créer une infrastructure qui surveille un serveur et vérifie le ping, le temps de réponse, et plus encore.
L'erreur est que les vérifications futures (par exemple: existe-t-il un certain fichier) seront ajoutées sans recompiler l'infrastructure..NET 3.5: Ajout dynamique de classes sans recompilation

Comment puis-je le construire de telle sorte que je puisse attacher des classes héritées avec des fonctionnalités différentes, et les exécuter sans recompilation?

Merci!

Répondre

3

En plus de créer une interface et de définir un point d'entrée unique pour votre nouvelle bibliothèque, vous pouvez créer un attribut qui identifie les classes que vous devez charger ou les méthodes que vous devez appeler. Vous utilisez ensuite la réflexion pour regarder toutes les DLL dans un certain chemin, et instancier/exécuter tout ce qui contient votre attribut.

J'ai créé une application similaire qui devait effectuer un certain nombre de vérifications de l'état de santé sur un système et qui devait être extensible. L'application a démarré, a parcouru toutes les DLL dans un chemin spécifié et pour chaque classe avec la décoration 'TestAttribute', elle créait une instance et exécutait la méthode 'Execute'. L'utilisation d'un attribut signifie que vous n'avez pas besoin de spécifier les DLL à traiter (pas besoin d'être dans config/database) car il est possible de traiter toutes les DLL en toute sécurité, et seules celles qui sont décorées avec l'attribut seront faire n'importe quoi.

+0

Encore une fois, il y a des bibliothèques là-bas (j'ai mentionné MEF) qui implémente déjà une grande partie de cette plomberie. –

+0

MEF semble intéressant mais n'est-ce pas exagéré? C'est un problème très simple. ma solution ici pourrait littéralement être juste 10 lignes pour une interface et 2 lignes pour une déclaration d'attribut. –

+0

Vous devrez également implémenter le "look for dlls" ... dans des conditions générales comme celle-ci, j'ai tendance à chercher des bibliothèques plutôt que de rouler les miennes.Peut-être que MEF fait plus qu'absolument nécessaire dans ce cas, mais tout de même, il va résoudre le problème en cours avec encore moins de code que vous décrivez. –

0

Du haut de ma tête.

Je présume que vous pouvez redémarrer votre application. Avoir un fichier qui répertorie toutes les DLL à charger qui implémentent vos fonctionnalités requises. Chaque DLL doit avoir le même point d'entrée. Chargez chaque DLL, appelez la méthode, déchargez DLL. boucle. Avertissement: Je n'ai jamais rien fait de tel, alors je parle peut-être de l'air chaud.

1

Implémentez une interface, et le provider pattern, alors vous pouvez brancher n'importe quoi à votre convenance. MSBuild est un excellent exemple de ceci, avec une interface simple, vous pouvez ajouter n'importe quel type de tâche que vous aimez pour votre processus de construction - suivez le même type de modèle.

0

On dirait que vous pourriez utiliser un mécanisme de «plugin». Définissez une interface de base et vous pouvez compiler chaque "vérification/action" dans un assemblage séparé. Charger dynamiquement tous vos assemblages à partir du fichier et appeler exécuter le contrôle/action via l'interface définie.

L'interface pourrait être tout aussi simple que cela, pour commencer:

public interface IMonitorAction 
{ 
    bool Exectute(); 
} 

Cette infrastructure vous permet d'ajouter d'autres contrôles par la simple création d'un fichier d'assemblage implémentant l'interface côté de ceux qui existent déjà.

0

En ajoutant à @slugsters answer, au lieu de créer votre propre infrastructure d'extensibilité, jetez un oeil aux bibliothèques d'extensibilité comme MEF.