¿Cómo resolver el contexto de la base de datos actual de EF7 en ASP NET 5 fuera del controlador?

asp.net-core entity-framework-core

Pregunta

Quiero obtener un contexto por solicitud en la aplicación ASP NET 5 / EF 7 para usarlo en algunos métodos (no en el controlador).

Desafortunadamente no encontré la respuesta en la documentación ASP.NET vNext plantilla y ejemplos aspnet / MusicStore

Respuesta aceptada

Puede utilizar algunos métodos para lograr este propósito.

Utilizando .AddDbContext<ApplicationDbContext>(); El método para registrar ApplicationDbContext en el sistema de inyección de dependencias (en el método ConfigureServices() ) lleva al hecho de que se registró como dependencia de ámbito (o en otras palabras, "por solicitud"). Por lo tanto, solo necesita obtenerlo del sistema de inyección de dependencia.

  1. Agregue su dbContext como parámetro del método constructor de su clase (en el que usará dbContext). Luego, debe obtener esta clase utilizando el sistema de inyección de dependencias, por ejemplo, agregado como parámetro del constructor del controlador.

    public class HabitsController : Controller
    {
        public HabitsController(HabitService habitService)
        {
    
        }
    }
    
    public class HabitService
    {
        private GetHabitsContext _dbContext;
    
        public HabitService(GetHabitsContext dbContext)
        {
            _dbContext = dbContext;
        }
    }
    
  2. Pero si no desea usar la inyección de constructor para obtener el contexto, puede obtener las dependencias necesarias utilizando el método GetService() (pero necesita la instancia de ServiceProvider para eso, en el ejemplo a continuación, también lo estoy obteniendo a través de la inyección de constructor).

    public class HabitsController : Controller
    {
        public HabitsController(HabitService habitService)
        {
    
        }
    }
    
    public class HabitService
    {
        private GetHabitsContext _dbContext;
    
        public HabitService(GetHabitsContext dbContext)
        {
            _dbContext = dbContext;
        }
    }
    
  3. En el primer método, también podemos obtener HabitService través del método GetService() (no a través de la inyección del constructor).

    public class HabitsController : Controller
    {
        public HabitsController(HabitService habitService)
        {
    
        }
    }
    
    public class HabitService
    {
        private GetHabitsContext _dbContext;
    
        public HabitService(GetHabitsContext dbContext)
        {
            _dbContext = dbContext;
        }
    }
    

Gracias Tseng por el comentario:

Debo tener en cuenta que es una mala práctica inyectar el contenedor en sus objetos. El contenedor solo debe ser referenciado desde la raíz de la composición y cierto tipo de fábricas (que se implementan en el nivel de la aplicación y no en la capa de dominio / negocio)


¡dbContext en HabitsController y _dbContext en HabitService son contextos diferentes!

Lo comprobé, este es el mismo contexto.




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué