2009-04-30 9 views
3

Je commence juste à porter une application sur ASP.net MVC et j'ai un objet qui maintient l'état de l'application (il surveille certains processus s'exécutant sur la machine, démarrant et s'arrêtant si nécessaire et envoyant/recevant le message MSMQ).ASP.net MVC: Où conserver les données d'application?

Où devrais-je conserver cet objet? Dans mon application actuelle (basée sur HttpListener) c'est un singleton, mais je sais que les singletons rendent les tests difficiles. Il serait difficile de simuler ou de tester cet objet, au moins dans le contexte de l'application MVC elle-même, et il dispose de son propre ensemble de tests en dehors de l'application. Cependant, il peut être nécessaire de remplacer par un talon pour les tests.

L'objet doit être mis à la disposition d'un certain nombre de contrôleurs. Où dois-je stocker cet objet et comment le rendre disponible aux contrôleurs? Je n'ai jamais vu un cas comme celui décrit dans les exemples ASP.net MVC que j'ai vu.

MISE À JOUR:

Je suppose que je dois expliquer pourquoi je ne peux pas stocker ces données dans une base de données. Je dois d'abord expliquer ce que l'application fait:

L'application sert des images qui sont générées dynamiquement par un certain nombre de "moteurs", qui sont des processus en cours d'exécution sur le serveur, communiquée à via MSMQ. Appelons l'objet Je pose la question sur le EngineManager. Le processus ressemble à ceci:

  1. Le client POSTE une requête XML au serveur, en donnant le nom de "moteur" à utiliser, ainsi qu'un certain nombre de paramètres décrivant l'image.
  2. L'application vérifie EngineManager pour voir si ce moteur est en cours d'exécution. Sinon, ça commence.
  3. L'application envoie un message MSMQ au moteur et attend la réponse.
  4. L'application renvoie l'image générée au client.
  5. Si à tout moment le moteur s'arrête ou tombe en panne, l'application doit en être consciente afin de pouvoir redémarrer à la prochaine demande de ce moteur.
  6. Lorsque l'application s'arrête, tous les moteurs sont également arrêtés.

Il existe plusieurs contrôleurs qui gèrent ces demandes, chacun effectuant un travail légèrement différent. Tous doivent communiquer avec le même EngineManager, comme il le faut également, dans certaines situations, synchroniser l'accès à d'autres ressources. Comme vous pouvez le voir, il ne s'agit pas d'un serveur Web classique protégé par une base de données.

+0

Merci pour le montage, beaucoup plus clair. –

Répondre

1

Si vous souhaitez que cet objet soit disponible pour tous les utilisateurs, c'est-à-direil n'est pas session spécifique, vous pouvez regarder la stocker dans l'état d'application:

http://msdn.microsoft.com/en-us/library/bf9xhdz4(VS.71).aspx

Cependant, l'état d'application présente plusieurs inconvénients, énumérés à la page liée ci-dessus, alors assurez-vous que ces problèmes ne concernent pas vous avant de descendre cette route. En général, j'évite l'état d'application et les données d'application de stockage dans une base de données backend. Comme vous ne voulez pas descendre cet état d'application de route peut être OK pour vous.

+2

Comment faites-vous cela dans une application MVC? La propriété Application n'est pas accessible via le contrôleur comme dans le code derrière dans une application ASP.NET traditionnelle. – senfo

+0

Encore une fois, "Comment faire cela dans une application MVC? La propriété Application n'est pas accessible via le contrôleur comme il était dans le code derrière dans une application ASP.NET traditionnelle." - Pourquoi est-ce marqué comme la réponse quand il ne répond pas clairement à la question dans le contexte d'une application MVC comme demandé. – hofnarwillie

+0

System.Web.HttpContext.Current.Application est accessible dans le contrôleur. –

-3

Conservez vos données d'application dans la base de données et accédez-y par couche de modèle. Le client conserve l'identifiant de session uniquement.

+0

Je ne peux pas conserver les données de cette application dans une base de données. Ce n'est pas un serveur traditionnel de base de données - il communique avec un certain nombre de processus sur la machine en utilisant MSMQ, et doit démarrer et arrêter ces processus, etc. Je l'ai expliqué dans la question. – Grokys

+0

Désolé si je n'étais pas clair, je vais ajouter une explication à la question. – Grokys

+0

Merci. pour m'aider. (L) –

2

Vous devez transmettre l'objet au constructeur de chaque instance Controller et les méthodes d'action du contrôleur doivent toutes utiliser l'instance d'objet transmise au constructeur de l'instance Controller.

La valeur par défaut ControllerFactory fournie avec ASP.NET MVC ne vous permet pas de le faire. Cependant, il existe des frameworks addon gratuits (celui que j'aime bien, Autofac) qui permettent ce style de programmation.

Questions connexes