2009-11-06 12 views
1

On m'a demandé d'écrire une application qui va agir en tant que contrôleur pour un certain nombre d'autres applications externes. Il s'exécutera en tant que tâche planifiée et son but sera de traiter tous les nouveaux fichiers trouvés dans un certain endroit et d'appeler des gestionnaires externes en fonction du type de fichier pour les traiter.C#: Communications découplées entre applications

L'application du contrôleur devra attendre que l'application du gestionnaire soit terminée avant d'appeler la suivante et devra également savoir si elle a réussi ou non. Il existe une complication supplémentaire en ce sens que certains des fichiers peuvent être des progiciels et qu'il est possible que l'objectif d'un progiciel soit de mettre à jour l'application du contrôleur elle-même. Pour cette raison, le cadre que j'utilise doit en tenir compte.

Fondamentalement, je suis juste à la recherche d'inspiration de conception ici pour essayer et comprendre une méthode robuste de communication découplée entre le contrôleur et le gestionnaire.

Répondre

2

Je pense que vous avez deux très problèmes distincts:

  1. Contrôleur/gestionnaire communication
  2. en place la mise à jour du logiciel du contrôleur

Il serait Soyez utile si vous pouviez décrire plus en détail à quoi ressemblent ces gestionnaires. S'agit-il d'assemblys .NET qui ont des classes implémentant une interface de gestionnaire? Si c'est comme ça, alors je suggère presque d'utiliser MEF pour localiser et charger les gestionnaires et les exécuter. MEF pourrait rendre l'emplacement et le chargement de ces gestionnaires beaucoup plus facile.

Les applications à mise à jour automatique sont toujours un peu délicates. Une façon que j'ai résolu ce problème est d'avoir une application en deux parties. La première partie est une petite application bootstrapper qui sait juste comment démarrer le contrôleur. Essentiellement, c'est le travail du bootstrappeur de localiser l'application du contrôleur et de le lancer. La façon dont j'ai fait cela est d'avoir un répertoire qui contient un sous-répertoire pour chaque nouvelle version de l'application que j'ai déployée. Le programme d'amorçage choisit simplement la version la plus élevée et lance l'application du contrôleur qu'il trouve dans ce répertoire.

structure de répertoire du contrôleur Exemple:

\Programs 
    \Controller 
     bootstrapper.exe 
     \v1.0 
      controller.exe 
     \v1.1 <-- Current version 
      controller.exe 

Lorsqu'une mise à jour est appliquée, tout ce qui arrive est un nouveau répertoire « version » est créé dans le répertoire du contrôleur et la mise à jour renvoie un code au contrôleur spécifiant qu'un le redémarrage est requis. Une fois que le contrôleur a terminé son travail, il quitte. Puisque le processus entier a été démarré par le programme d'amorçage (et les blocs d'amorçage lorsqu'il lance le contrôleur), le programme d'amorçage reprend le contrôle lorsque le contrôleur se lance.Le programme d'amorçage exécute à nouveau son processus de démarrage, trouve la nouvelle version du contrôleur et le lance. Le seul attrape ici est qu'il n'est pas facile de mettre à jour le bootstrapper, mais généralement ce ne sera pas quelque chose que vous mettez à jour très souvent car il contient très peu de code.

L'espoir qui aide ou suscite quelques idées.

+0

Les gestionnaires n'existent pas encore mais il semble très probable que ces applications seront autonomes. Nous ne sommes pas responsables de l'écriture de tous les gestionnaires et donc la décision a été prise pour la simplicité. La suggestion de bootstrap est intéressante, en particulier l'utilisation de dossiers de version, ce qui mérite d'être considéré, merci. – Andrew

0

Vous pouvez essayer d'utiliser NServiceBus comme système de messagerie entre le contrôleur et les gestionnaires. Cela ressemble à un scénario assez simple, le contrôleur envoie un message à un gestionnaire particulier, puis attend une réponse. En fonction de la réponse, il envoie un autre message à un autre gestionnaire, et ainsi de suite.

Vous ne savez pas exactement comment faire des mises à jour à distance.

0

Vous pouvez penser à ceci: Un flux de travail au sein du service WCF hébergé en tant que service Windows. Vous pouvez décider en fonction de votre exigence que vous souhaitez un flux de travail séquentiel ou d'état. J'espère que this vous aidera à comprendre mieux

Questions connexes