In che modo EF7 bootstrap dependency injection (IServiceCollection) se non si utilizza ASP.NET 5?

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

Domanda

Sto ancora cercando di capire come funziona con ASP.NET 5 / EF 7. Sto usando progetti DNX (.xproj).

Startup viene utilizzato da OWIN / ASP.NET per la configurazione, il caricamento di servizi, ecc. Ma viene anche utilizzato per le migrazioni EF 7 (per impostare DbContextOptions ad esempio).

Il mio obiettivo principale è sapere come il bootstrap EF7 (e ASP.NET 5) con Startup e chi sta creando la classe startup, inizializzando il contenitore DI, ecc.

Un esempio di ciò che devo fare, per il contesto, è che nei miei test di unità xUnit (che sono nel loro assembly e riferimento all'assembly di dati che non ha una classe di Startup ), ho bisogno di AddDbContext per impostare la mia connessione.

Ho la classe di avvio di esempio:

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)
        {
        }
    }
}

Questo è attualmente nel mio assembly di dati e non nel mio assembly test di unità. Ho provato ad aggiungere l'impostazione dell'app (so che è OWIN ma ho pensato di dargli una possibilità):

<appSettings>
    <add key="owin:appStartup" value="Radar.Data.Startup, Radar.Data" />
</appSettings>

La classe di avvio non viene eseguita.

Mi piacerebbe davvero capire il meccanismo generale con Startup , chi lo chiama, ecc., Ma per ora, ho solo bisogno di capire come EF 7 inizializza dipendenze / servizi in modo da poter inizializzare correttamente i miei test unitari.

AGGIORNAMENTO Ecco quello che ho ottenuto nel mio test unitario finora e ho pensato di farlo funzionare a un certo punto:

ServiceCollection serviceCollection = new ServiceCollection();
IServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
DbContextActivator.ServiceProvider = serviceProvider;
serviceCollection.AddEntityFramework()
    .AddSqlServer()
    .AddDbContext<RadarDbContext>(
    options => options.UseSqlServer("Server=.;Database=SonOfRadar;Trusted_Connection=True;MultipleActiveResultSets=True"));

ma ora sto ricevendo No service for type 'Microsoft.Data.Entity.Internal.IDbSetInitializer' has been registered quando il mio DbContext è istanziato. Quindi ovviamente non si caricano tutti i servizi EF.

Se commento:

DbContextActivator.ServiceProvider = serviceProvider;

errori precedenti 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.

Impostazione DbContextActivator.ServiceProvider è l'unico posto in EF7 in cui posso trovare un gancio per impostare il proprio provider. Sarei altrettanto felice di avere un'istanza della raccolta di servizi interni di EF7 e di lavorare con questo. Penso che analizzerò di nuovo il codice di test dell'unità EF7 e vedrò se mi manca un pezzo critico.

Risposta accettata

Startup classe di Startup viene creata dal pacchetto Microsoft.AspNet.Hosting quando si esegue l'applicazione Web (consultare StartupLoader.cs ).

È anche possibile esaminare il metodo WebApplication.Run ( WebApplication.Run ) come un punto di accesso alle applicazioni Web ASP.NET 5.

DI è inizializzato a WebHostBuilder classe ( WebHostBuilder.cs ) e all'interno dnx in Bootstrapper classe ( Bootstrapper.cs )




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é