2011-01-31 15 views
5

Francamente sono un principiante in C# e Asp.net MVC. Inoltre non so come l'applicazione web asp.net funzioni effettivamente su IIS e framework ASP.NET dietro la scena.Campo statico di DbContext in Global.asax rispetto al campo di istanza di DbContext nella classe controller?

Sono confuso con la decisione in cui devo dichiarare un campo di DbContext (o qualsiasi classe derivata da DbContext) nella mia applicazione asp.net mvc.

ho due scelte:

  1. dichiarare il campo come un campo statico all'interno global.asax in modo tale che tutti i controllori possono fare uso di esso.
  2. Dichiarare il campo come campo di istanza all'interno di ogni classe di controller.

Puoi spiegarci quale è quella giusta? Una spiegazione più dettagliata è davvero necessaria.

risposta

8

Se si imposta un campo statico in global.asax, si verificheranno problemi di concorrenza. Più thread provenienti da più richieste possono entrare e ottenere reciprocamente i dati. Quel che è peggio è che questo non verrà visualizzato fino a quando non inizierai a ricevere più traffico sul tuo sito web, o fino a quando non inizi a caricare i test. Lo implementerai come un singleton, tutto funzionerà bene nei tuoi test e penserai "Sono un genio! Guarda com'è pulita questa implementazione!" Ma un giorno sarai bruciato da questo, come lo sono stato io. I risultati verranno confusi, gli utenti inizieranno a visualizzare i dati che non appartengono a loro e il sito Web si comporterà in modo imprevisto.

Le classi di contesto per Entity Framework e LINQ to SQL sono state progettate per essere un'istanza leggera, qualcosa che si imposta per ogni serie di query che si desidera eseguire. Non è pensato per essere vissuto a lungo.

Check out this other Stack Overflow question/answer on the same topic, worded differently.

4

Si dovrebbe andare con la seconda opzione. cioè dichiararlo e usarlo nel controller. Se si colloca DBContext come campo statico in global.asax, si sta praticamente diventando una singola istanza per l'intera applicazione.

D'altra parte, con la seconda opzione si dispone di un DBcontext per ogni richiesta. Sarebbe meglio se si potesse usare un'iniezione di dipendenza per ottenere DBContext in ogni metodo di azione.

+0

qual è l'inconveniente se faccio uso di una singola istanza di DbContext (o una classe derivata da DbContext) per l'intera applicazione? – LaTeX

+2

@Stack Overflow - leggi su "singleton" in termini di connessioni al database e perché è malvagio. – RPM1984

Problemi correlati