Frage

Ich bin gerade erst die Portierung einer Anwendung ASP.net MVC und ich habe ein Objekt halten, den Zustand der Anwendung (es merkt sich bestimmte Prozesse auf dem Computer ausgeführt wird, starten und anhalten als nötig und das senden/empfangen von MSMQ-Nachricht).

Wo soll ich es halten dieses Objekt?In meiner aktuellen Anwendung (basierend auf den HttpListener) es ist ein singleton, aber ich weiß, singletons das testen schwierig.Es würde schwierig sein, zu verspotten oder zu testen, das Objekt, zumindest im Rahmen des MVC-Anwendung selbst, und es hat seinen eigenen Satz von tests, die außerhalb der Anwendung sowieso.Aber es muss ersetzt werden durch einen stub für die Prüfung.

Das Objekt muss zur Verfügung gestellt werden, um eine Reihe von Controllern.Wo sollte ich speichern Sie dieses Objekt und wie sollte ich zur Verfügung stellen, um die Controller?Ich habe noch nie einen Fall wie diesen gesehen beschriebenen ASP.net MVC-Beispiele, die ich gesehen habe.

UPDATE:

Ich glaube, ich muss erklären, warum ich kann nicht speichern diese Daten in einer Datenbank.Zuerst muss ich erklären, was das Programm macht:

Die Anwendung dient der Bilder, die dynamisch erzeugt werden, indem eine Reihe von "Motoren", die Prozesse auf dem server ausgeführt wird, kommuniziert über MSMQ -.Nennen wir das Objekt, ich bin zu Fragen, die Frage über die EngineManager.Der Prozess geht in etwa so:

  1. Der client sendet eine XML-Anforderung an den server, der den Namen "engine" verwendet werden, sowie eine Reihe von Parametern Beschreibung des Bildes.
  2. Die Anwendung überprüft die EngineManager um zu sehen, wenn Motor läuft.Wenn nicht, startet es.
  3. Die Anwendung posts eine MSMQ-Nachricht an den Motor an und wartet auf die Antwort.
  4. Die Anwendung sendet die generierte Bild an den client zurück.
  5. Wenn an irgendeinem Punkt der Motor heruntergefahren wird oder abstürzt, müssen Sie die Anwendung bewusst sein, so dass es neu gestartet werden kann auf der nächsten Anfrage zu dieser Maschine.
  6. Wenn die Anwendung heruntergefahren wird, werden alle Motoren werden ebenfalls heruntergefahren.

Es gibt mehrere Controller, mit diesen Anforderungen, die alle einen etwas anderen job.Alle von Ihnen müssen kommunizieren mit dem gleichen EngineManager, wie es auch braucht, um in bestimmten Situationen synchronisieren der Zugang zu anderen Ressourcen.

Wie Sie sehen können, es ist nicht deine typische Datenbank-gesicherten webserver.

War es hilfreich?

Lösung

Wenn Sie möchten, dass dieses Objekt für alle Benutzer verfügbar, d.h.es ist keine Sitzung spezifisch sind, sehen Sie auf speichern, um Sie in den Zustand der Anwendung:

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

Jedoch, den Zustand der Anwendung hat mehrere Nachteile, wie aufgeführt auf der Seite weiter oben verlinkt, so stellen Sie sicher, dass diese Fragen nicht auf Sie wirkt, bevor Sie gehen, dass die route.Im Allgemeinen habe ich meiden von Applciation Zustand und store-Anwendung, die Daten in einem backend DB.Sie wollen nicht diesen Weg gehen, den Zustand der Anwendung kann für Sie auf OK.

Andere Tipps

Sollten Sie übergeben das Objekt an den Konstruktor der einzelnen Controller Instanz, und die controller-Aktion Methoden sollten alle verwenden die Objekt-Instanz übergeben, um die Controller instance constructor.

Die Standard - ControllerFactory die Schiffe mit ASP.NET MVC wird Ihnen nicht erlauben, dies zu tun.Jedoch gibt es Kostenlose addon-frameworks (der, den ich mag, ist Autofac) die Erlaubnis diese Art der Programmierung.

Halten Sie Ihre Anwendung Daten in der Datenbank und Zugriff auf diese von Modell-Ebene.Kunden halten die session-id nur.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top