Come risolvere il contesto attuale del database EF7 in ASP NET 5 fuori dal controller?

asp.net-core entity-framework-core

Domanda

Voglio ottenere un contesto per richiesta nell'app ASP NET 5 / EF 7 per usarlo in alcuni metodi (non nel controller).

Purtroppo non ho trovato la risposta nella documentazione ASP.NET modello vNext ed esempi aspnet / MusicStore

Risposta accettata

È possibile utilizzare alcuni metodi per raggiungere questo scopo.

Utilizzando .AddDbContext<ApplicationDbContext>(); metodo per la registrazione di ApplicationDbContext nel sistema di iniezione delle dipendenze (nel metodo ConfigureServices() ), porta al fatto che è registrato come dipendenza Scoped (o in altre parole "per richiesta"). In tal modo è sufficiente ottenerlo dal sistema di iniezione delle dipendenze.

  1. Aggiungi il tuo dbContext come parametro del metodo di costruzione della tua classe (in cui utilizzerai dbContext). Quindi devi ottenere questa classe usando il sistema di iniezione delle dipendenze, ad esempio aggiunto come parametro del costruttore del controllore.

    public class HabitsController : Controller
    {
        public HabitsController(HabitService habitService)
        {
    
        }
    }
    
    public class HabitService
    {
        private GetHabitsContext _dbContext;
    
        public HabitService(GetHabitsContext dbContext)
        {
            _dbContext = dbContext;
        }
    }
    
  2. Ma se non si desidera utilizzare l'iniezione del costruttore per ottenere il contesto, è possibile ottenere le dipendenze necessarie utilizzando il metodo GetService() (ma è necessario l'istanza di ServiceProvider per questo, nell'esempio seguente, anch'io sto facendo l'iniezione del costruttore).

    using Microsoft.Framework.DependencyInjection; // for beta 6 and below
    using Microsoft.Extensions.DependencyInjection; // for beta 7 and above
    public class HabitService
    {
        private IServiceProvider _serviceProvider;
    
        public HabitService(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }
    
        public GetHabit()
        {
             var dbcontext = _serviceProvider.GetService<ApplicationDbContext>();
        }
    }
    
  3. Nel primo metodo, possiamo ottenere HabitService tramite il metodo GetService() (non tramite l'iniezione del costruttore).

    using Microsoft.Framework.DependencyInjection; // for beta 6 and below
    using Microsoft.Extensions.DependencyInjection; // for beta 7 and above
    
    public class HabitsController : Controller
    {
        public HabitsController(IServiceProvider serviceProvider)
        {
           var habitService= serviceProvider.GetService<HabitService>();
        }
    }
    
    public class HabitService
    {
        private GetHabitsContext _dbContext;
    
        public HabitService(GetHabitsContext dbContext)
        {
            _dbContext = dbContext;
        }
    }
    

Grazie Tseng per l'osservazione:

Dovrei essere notato, che è una pratica abbastanza brutta iniettare il contenitore nei tuoi oggetti. Il contenitore deve essere referenziato solo dalla radice della composizione e da un certo tipo di fabbriche (che sono implementate a livello di applicazione e non nel dominio / livello aziendale)


dbContext in HabitsController e _dbContext in HabitService sono diversi contesti!

Ho controllato, questo è lo stesso contesto.



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é