Comment résoudre le contexte de base de données actuel EF7 dans ASP NET 5 hors du contrôleur?

asp.net-core entity-framework-core

Question

Je souhaite obtenir un contexte par demande dans l'application ASP NET 5 / EF 7 pour l'utiliser dans certaines méthodes (pas dans le contrôleur).

Malheureusement, je n'ai pas trouvé de réponse dans la documentation Modèle ASP.NET vNext et exemples aspnet / MusicStore

Réponse acceptée

Vous pouvez utiliser certaines méthodes pour atteindre cet objectif.

Utilisation de .AddDbContext<ApplicationDbContext>(); La méthode d’enregistrement d’ ApplicationDbContext dans le système d’injection de dépendances (dans la méthode ConfigureServices() ) conduit à ce qu’elle soit enregistrée en tant que dépendance Scoped (ou dans un autre mot "par demande"). De ce fait, vous n’avez besoin que de l’obtenir auprès du système d’injection de dépendance.

  1. Ajoutez votre dbContext en tant que paramètre de la méthode constructeur de votre classe (dans laquelle vous utiliserez dbContext). Ensuite, vous devez obtenir cette classe en utilisant le système Dependency Injection, par exemple en l'ajoutant en tant que paramètre du constructeur de l'automate.

    public class HabitsController : Controller
    {
        public HabitsController(HabitService habitService)
        {
    
        }
    }
    
    public class HabitService
    {
        private GetHabitsContext _dbContext;
    
        public HabitService(GetHabitsContext dbContext)
        {
            _dbContext = dbContext;
        }
    }
    
  2. Mais si vous ne souhaitez pas utiliser l'injection de constructeur pour obtenir le contexte, vous pouvez obtenir les dépendances nécessaires à l'aide de la méthode GetService() (mais vous avez besoin de l'instance de ServiceProvider pour cela, dans l'exemple ci-dessous, je l'obtiens également par injection de constructeur).

    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. Dans la première méthode, nous pouvons également obtenir HabitService via la méthode GetService() (et non via l'injection du constructeur).

    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;
        }
    }
    

Merci Tseng pour la remarque:

Je dois noter que c’est une très mauvaise pratique d’injecter le conteneur dans vos objets. Le conteneur ne doit être référencé qu'à partir de la racine de la composition et de certains types d'usines (implémentées au niveau de l'application, et non dans la couche domaine / métier).


dbContext dans HabitsController et _dbContext dans HabitService sont des contextes différents!

J'ai vérifié, c'est le même contexte.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi