Costruttore EF7 con iniezione di dipendenza MVC6

asp.net-core-mvc c# dependency-injection entity-framework entity-framework-core

Domanda

Test del nuovo framework MVC6 ed EF7.

Spesso abbiamo bisogno di HttpContext nei nostri livelli di database. Per fare ciò in MVC6 abbiamo semplicemente un costruttore DbContext che assomiglia a questo:

 public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {                  
        HttpContext _httpContext;                     
        public ApplicationUser CurrentUser { get; set; }                

        public ApplicationDbContext(IHttpContextAccessor httpContextFactory=null)

e nel nostro Startup.cs registriamo il nostro DI in questo modo:

services.AddTransient<IHttpContextAccessor, HttpContextAccessor>();

Questo funziona perfettamente ...

... finché non lo fa. Quando si esegue l'applicazione, tutto va bene. Tuttavia, quando ho bisogno di applicare alcune modifiche al modello usando "dnx. Ef migrazione aggiungi" otteniamo un errore "Nessun costruttore senza parametri definito per questo oggetto".

Ok nessun problema. Quindi aggiungiamo un costrutto addizionale senza parametri, che vogliamo essere usati solo dal processo di migrazione. Tuttavia, il processo DI registra il costruttore senza parametri solo così l'oggetto HttpContext non viene mai passato.

Quindi, come posso ottenere il modello DI predefinito di MVC per utilizzare con forza il mio costruttore con il parametro? e mantenere il costruttore senza parametri per le migrazioni?

Risposta popolare

Specificare quale costruttore chiamare quando la classe è registrata non è supportato dal DI di base ASP.NET out-of-the-box (risolve solo i tipi con un costruttore pubblico).

A questo scopo è possibile utilizzare DI più avanzato, ad esempio è disponibile una versione alpha2 di autofac per ASP.NET 5 ("Autofac": "4.0.0.0-alpha2", "Autofac.Dnx": "4.0.0-alpha1" ).




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché