Nei controller ASP.NET MVC3, dove si crea un'istanza di DataContext?

7

Nelle applicazioni ASP.NET MVC 3 che utilizzano un DataContext o DbContext , dove si istanzia il tuo oggetto di accesso ai dati?

Ecco un elenco non esaustivo di dove l'ho visto fare:

  • Individualmente all'interno di ciascun metodo del controller
  • Nel costruttore del controllore
  • Come una proprietà (inizializzata in modo pigro) del controller
  • In ActionFilter, spinto in ViewBag
  • In Global.asax Application_BeginRequest
  • In un HttpModule

Non riesco a identificare un chiaro front runner tra tutti. Quel che è peggio, ogni volta che inizio un progetto nuovo di zecca, tendo a cambiarlo, solo perché .

Qualcuno ha qualche consiglio provato in battaglia?

    
posta Portman 25.03.2011 - 18:24
fonte

3 risposte

7

Il mio framework di iniezione delle dipendenze controlla la creazione e la durata di DbContext. L'istanziazione di solito si verifica quando il controller (o una delle sue dipendenze) viene istanziato.

    
risposta data 25.03.2011 - 19:08
fonte
2

Fondamentalmente, lo memorizzo in HttpContext.Items , istanzialo la prima volta che è necessario e riutilizzandolo se è necessario nuovamente. La durata di HttpContext.Items è la durata della richiesta web, quindi quando tutto il lavoro per la richiesta è completo, il contesto dei dati è finito.

Ho avuto l'idea dalla terza storia in questo blog post di Steven Sanderson , che ha anche alcuni consigli per estendere tale idea con l'inversione del controllo, quindi non c'è alcuna dipendenza tra il tuo livello dati e HttpContext .

    
risposta data 26.03.2011 - 00:09
fonte
1

Per i progetti più piccoli I In pratica, memorizzalo in HttpContext.Items . Tuttavia, adoro il caricamento lazying, quindi non sono un fan della rotazione di un DBContext su ogni richiesta HttpApplication. Così, invece, ho scritto quanto segue:

public static class ControllerExtensions
{
    public static MyDBContext MyDBContext(this Controller instance)
    {
        MyDBContext result = 
          instance.HttpContext.Items[typeof(MyDBContext).Name] as MyDBContext ;

        if (result == null)
        {
            result = new MyDBContext ();
            instance.HttpContext.Items[typeof(MyDBContext).Name] = result;
        }

        if (result == null)
        {
            throw new InvalidOperationException("No DBContext in HttpContext.");
        }

        return result;
    }

Questo significa che ho un DBContext a richiesta strongmente caricato, pigro, singolo, MyDBContext disponibile per qualsiasi controller da utilizzare.

public HomeController
{
  public ActionResult Index()
  {
    List<string> model = this.MyDBContext().Cars
                                           .Select(x => x.Name)
                                           .ToList();

    this.View(model);
  }
}
    
risposta data 26.04.2012 - 08:29
fonte

Leggi altre domande sui tag