¿Cómo funciona la inyección de dependencia EF7 bootstrap (IServiceCollection) si no está en ASP.NET 5?

asp.net-core dependency-injection entity-framework-core

Pregunta

Sigo intentando entender qué es qué con ASP.NET 5 / EF 7. Estoy usando proyectos DNX (.xproj).

Startup es utilizado por OWIN / ASP.NET para configurar, los servicios de carga, etc, pero que también se usa para EF 7 migraciones (Para configurar el DbContextOptions por ejemplo).

Mi objetivo principal es saber cómo arrancar EF7 (y ASP.NET 5) con Startup y quién está creando la clase de inicio, inicializando el contenedor DI, etc.

Un ejemplo de lo que necesito hacer, por contexto, es que en mis pruebas de unidad xUnit (que están en su propio ensamblaje y hacen referencia a mi conjunto de datos que no tiene una clase de Startup ), necesito AddDbContext para establecer mi conexión.

Tengo la clase de inicio de muestra:

namespace Radar.Data
{
    using Microsoft.AspNet.Builder;
    using Microsoft.AspNet.Hosting;
    using Microsoft.Data.Entity;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.PlatformAbstractions;

    public class Startup
    {
        public IConfigurationRoot Configuration { get; set; }

        public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(appEnv.ApplicationBasePath)
                .AddJsonFile("appsettings.json");

            Configuration = builder.Build();
        }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddEntityFramework()
                .AddSqlServer()
                .AddDbContext<RadarDbContext>(options =>
                    options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));
        }

        public void Configure(IApplicationBuilder app)
        {
        }
    }
}

Esto está actualmente en mi conjunto de datos y no en mi conjunto de prueba de unidad. Intenté agregar la configuración de la aplicación (sé que es OWIN pero pensé en probarlo):

namespace Radar.Data
{
    using Microsoft.AspNet.Builder;
    using Microsoft.AspNet.Hosting;
    using Microsoft.Data.Entity;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.PlatformAbstractions;

    public class Startup
    {
        public IConfigurationRoot Configuration { get; set; }

        public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(appEnv.ApplicationBasePath)
                .AddJsonFile("appsettings.json");

            Configuration = builder.Build();
        }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddEntityFramework()
                .AddSqlServer()
                .AddDbContext<RadarDbContext>(options =>
                    options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));
        }

        public void Configure(IApplicationBuilder app)
        {
        }
    }
}

La clase de inicio no se está ejecutando.

Realmente me gustaría entender el mecanismo general con Startup , quién lo llama, etc., pero por ahora, solo necesito entender cómo EF 7 inicializa las dependencias / servicios para poder inicializar correctamente mis pruebas de unidad.

ACTUALIZACIÓN Esto es lo que tengo en mi prueba de unidad hasta ahora y pensé que lo tenía funcionando en un punto:

namespace Radar.Data
{
    using Microsoft.AspNet.Builder;
    using Microsoft.AspNet.Hosting;
    using Microsoft.Data.Entity;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.PlatformAbstractions;

    public class Startup
    {
        public IConfigurationRoot Configuration { get; set; }

        public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(appEnv.ApplicationBasePath)
                .AddJsonFile("appsettings.json");

            Configuration = builder.Build();
        }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddEntityFramework()
                .AddSqlServer()
                .AddDbContext<RadarDbContext>(options =>
                    options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));
        }

        public void Configure(IApplicationBuilder app)
        {
        }
    }
}

pero ahora no estoy recibiendo No service for type 'Microsoft.Data.Entity.Internal.IDbSetInitializer' has been registered cuando se DbContext una instancia de mi DbContext . Así que obviamente no se cargan todos los servicios de EF.

Si yo comento:

namespace Radar.Data
{
    using Microsoft.AspNet.Builder;
    using Microsoft.AspNet.Hosting;
    using Microsoft.Data.Entity;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.PlatformAbstractions;

    public class Startup
    {
        public IConfigurationRoot Configuration { get; set; }

        public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(appEnv.ApplicationBasePath)
                .AddJsonFile("appsettings.json");

            Configuration = builder.Build();
        }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddEntityFramework()
                .AddSqlServer()
                .AddDbContext<RadarDbContext>(options =>
                    options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));
        }

        public void Configure(IApplicationBuilder app)
        {
        }
    }
}

Error antes con: No database providers are configured. Configure a database provider by overriding OnConfiguring in your DbContext class or in the AddDbContext method when setting up services.

Configurar DbContextActivator.ServiceProvider es el único lugar en EF7 donde puedo encontrar un gancho para configurar su propio proveedor. Me encantaría tener una instancia de la colección de servicios internos de EF7 y trabajar con eso. Creo que volveré a revisar el código de prueba de la unidad EF7 y veré si me falta una pieza crítica.

Respuesta aceptada

Startup clase de Startup la crea Microsoft.AspNet.Hosting paquete Microsoft.AspNet.Hosting cuando ejecuta su aplicación web (consulte StartupLoader.cs ).

También puede consultar el método WebApplication.Run ( WebApplication.Run ) es un punto de entrada a las aplicaciones web ASP.NET 5.

DI se inicializa en WebHostBuilder clase ( WebHostBuilder.cs ) y en el interior dnx en Bootstrapper clase ( Bootstrapper.cs )




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é