2014-11-03 7 views
8

In MVC 5, i codici di ponteggi avrà qualcosa di simile:Disponi DbContext in MVC Controller, quale "migliore"?

public class MyController : Controller 
{ 
    private MyContext db = new MyContext(); 

    protected override void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      db.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 

altrimenti, ho bisogno di avere

using (var db = new MyContext()) 
{...} 

in ogni azione.

I codici sembrano buoni, quindi non ho bisogno di usare l'utilizzo in ogni azione. Tuttavia, questo è soggetto alla preferenza dei programmatori, o tale stile ha qualche vantaggio rispetto all'utilizzo in ciascuna azione che deve utilizzare dbcontext?

risposta

6

Entrambe le soluzioni sono buone: entrambe le soluzioni elimineranno il contesto db. Ma a mio parere la seconda opzione sarà migliore: crei il contesto db proprio dove devi.

E se un'altra classe (qualche classe di servizio) utilizza anche il contesto db. È buona norma avere un contesto db per l'intera richiesta web. In tal caso, è necessario passare il precedente contesto db creato a tutte le classi che utilizzano il contesto db per impedire la creazione di un nuovo contesto db in tutte le clases. Quindi prenderò in considerazione l'utilizzo di contenitori IoC. Il contenitore IoC risolverà le dipendenze e manterrà anche la durata dell'oggetto. Bellow

ho elencato alcuni contenitori IoC:

+1

Entrambe le soluzioni producono lo stesso risultato, ma entrambe non sono buone soluzioni. Il motivo per cui il modello ha un singolo DbContext è per rendere più facile il test, e questo è chiaramente perso nella persona che fa la domanda. – Ben

1

A L'istruzione using chiama automaticamente il metodo Dispose() alla fine del blocco Using. L'istruzione Using chiama il metodo Dispose() anche se si è verificato un errore nel codice.

1

In termini di migliori pratiche, si dovrebbe assolutamente utilizzare il materiale ponteggi modello e non si scherza con il modello using(){} a meno che non si abbia qualche motivo imperativo valido. Entrambe le soluzioni producono lo stesso risultato, ma entrambe non sono buone soluzioni. Il motivo per cui il modello ha un unico DbContext è quello di rendere più facile la prova - Ecco un esempio:

public class SomeController : Controller 
{ 
    private ApplicationDbContext db; 

    public AccountController() 
    { 
     db = new ApplicationDbContext(); 
    } 

    public AccountController(ApplicationDbContext context) 
    { 
     db = context; 
    } 
} 

Il primo costruttore senza argomenti è quello che viene utilizzato nella produzione e crea un contesto nuovo db sulla base automaticamente il file di configurazione dell'app. Il secondo consente di iniettare un contesto db simulato quando si eseguono test unitari.

Alla fine della giornata, questa domanda e la mia risposta non riguardano proprio lo smaltimento dei contesti di db: si tratta del motivo per cui i progettisti del modello di codice hanno scelto di adottare l'approccio che hanno fatto e il motivo per cui vi aiuterà. È necessario il test dell'unità read more on.

+0

Hai spiegato bene pro e contro da diverse angolazioni. Tuttavia, l'utilizzo del sistema rende più facile il refactoring.Ad esempio, in alcuni progetti recenti, ho DbContext fuori dal controller tramite un DAL in cima a DBContext, anche se DBContext stesso è un DAL. Tale approccio rende il controller uno strato di trasporto molto sottile. Se lo desidero, potrei trasmettere facilmente gli stessi dati tramite WCF. – ZZZ

Problemi correlati