Domanda

Sto appena iniziando il porting di un'applicazione su ASP.net MVC e ho uno stato che contiene lo stato dell'applicazione (tiene traccia di alcuni processi in esecuzione sul computer, avviando e arrestando se necessario e inviando / ricevendo il messaggio MSMQ).

Dove devo conservare questo oggetto? Nella mia attuale applicazione (basata su HttpListener) è un singleton, tuttavia so che i singleton rendono difficili i test. Sarebbe difficile deridere o testare questo oggetto, almeno nel contesto dell'applicazione MVC stessa, e ha comunque un proprio set di test all'esterno dell'applicazione. Tuttavia potrebbe essere necessario sostituirlo con uno stub per il test.

L'oggetto deve essere reso disponibile a un numero di controller. Dove devo archiviare questo oggetto e come dovrei renderlo disponibile ai controller? Non ho mai visto un caso come questo descritto in alcun esempio di MVC ASP.net che ho visto.

UPDATE:

Suppongo di dover spiegare perché non riesco a memorizzare questi dati in un database. Innanzitutto devo spiegare cosa fa l'applicazione:

L'applicazione serve immagini generate dinamicamente da un numero di "motori", che sono processi in esecuzione sul server, comunicati tramite MSMQ. Consente di chiamare l'oggetto che sto ponendo la domanda su EngineManager. Il processo procede in questo modo:

  1. Il client invia una richiesta XML al server, dando il nome di "motore" da utilizzare, oltre a una serie di parametri che descrivono l'immagine.
  2. L'applicazione controlla EngineManager per vedere se quel motore è in esecuzione. In caso contrario, lo avvia.
  3. L'applicazione pubblica un messaggio MSMQ nel motore e attende la risposta.
  4. L'applicazione restituisce l'immagine generata al client.
  5. Se in qualsiasi momento il motore si spegne o si arresta in modo anomalo, l'applicazione deve essere consapevole di ciò in modo che possa essere riavviato alla successiva richiesta a quel motore.
  6. Quando l'applicazione si spegne, anche tutti i motori vengono spenti.

Esistono diversi controller che gestiscono queste richieste, ognuna facendo un lavoro leggermente diverso. Tutti devono comunicare con lo stesso EngineManager, così come deve, in determinate situazioni sincronizzare l'accesso ad altre risorse.

Come puoi vedere, non è il tuo tipico server web supportato da database.

È stato utile?

Soluzione

Se si desidera che questo oggetto sia disponibile per tutti gli utenti, ovvero non sia specifico per la sessione, è possibile cercare di memorizzarlo nello stato dell'applicazione:

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

Tuttavia, lo stato dell'applicazione presenta diversi svantaggi, come elencato nella pagina collegata sopra, quindi assicurati che questi problemi non ti influenzino prima di percorrere quella strada. In generale, mi allontano dallo stato di Applciation e memorizzo i dati dell'applicazione in un database back-end. Poiché non vuoi scendere in questo stato di applicazione del percorso, potrebbe essere OK per te.

Altri suggerimenti

Dovresti passare l'oggetto al costruttore di ogni istanza Controller e tutti i metodi di azione del controller dovrebbero usare l'istanza dell'oggetto passata al costruttore dell'istanza Controller .

Il ControllerFactory predefinito fornito con ASP.NET MVC non ti consentirà di farlo. Tuttavia, ci sono framework di addon gratuiti (quello che mi piace è Autofac) che consente questo stile di programmazione.

Conserva i dati dell'applicazione nel database e accedi a questi per livello di modello. Il client mantiene solo l'ID sessione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top