ASP.NET 5에없는 경우 EF7 부트 스트랩 종속성 주입 (IServiceCollection)은 어떻게됩니까?

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

문제

나는 여전히 ASP.NET 5 / EF 7에서 내 머리를 잡으려고 노력하고 있습니다. DNX 프로젝트 (.xproj)를 사용하고 있습니다.

Startup 은 OWIN / ASP.NET에서 구성,로드 서비스 등에 사용되지만 EF 7 마이그레이션 (예 : DbContextOptions 설정)에도 사용됩니다.

내 주요 목표는 EF7 (및 ASP.NET 5)이 Startup 부트 스트랩하고 누가 시작 클래스를 만들고 DI 컨테이너를 초기화 하는지를 아는 것입니다.

컨텍스트에서해야 할 일의 예는 xUnit 유닛 테스트 (자체 어셈블리에 있고 Startup 클래스가없는 데이터 어셈블리를 참조)에서 연결을 설정하기 위해 AddDbContextAddDbContext 한다는 것입니다.

샘플 시작 클래스가 있습니다.

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

현재 데이터 어셈블리에 있지만 내 단위 테스트 어셈블리에는 없습니다. 나는 앱 설정을 추가하려고 시도했다. (나는 그것이 OWIN이라는 것을 알았지 만, 나는 그것을 줄 것이라고 생각했다.)

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

시작 클래스가 실행되지 않습니다.

저는 Startup 에서 전반적인 메커니즘에 대해 잘 알고 싶습니다.하지만, 지금은 EF 7이 종속성 / 서비스를 초기화하는 방법에 대한 이해가 필요합니다. 그러면 단위 테스트를 올바르게 초기화 할 수 있습니다.

업데이트 지금까지 단원 테스트에서 얻은 내용이 있습니다. 한 번에 작동하는 것으로 생각했습니다.

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

하지만 지금은 받고있어 No service for type 'Microsoft.Data.Entity.Internal.IDbSetInitializer' has been registered DbContext 가 인스턴스화 될 때 No service for type 'Microsoft.Data.Entity.Internal.IDbSetInitializer' has been registered . 따라서 모든 EF 서비스가로드되지는 않습니다.

내가 코멘트하면 :

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

이전 오류 : 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.

DbContextActivator.ServiceProvider 설정하면 DbContextActivator.ServiceProvider 에서 유일한 공급자가되어 자신의 공급자를 설정할 수 있습니다. 나는 EF7의 내부 서비스 콜렉션의 인스턴스를 얻고 그 작업을하는 것이 행복 할 것입니다. EF7 유닛 테스트 코드를 다시 살펴보고 필자가 중요한 부분을 놓치고 있는지 확인합니다.

수락 된 답변

Startup 클래스는 웹 응용 프로그램을 실행할 때 Microsoft.AspNet.Hosting 패키지에 의해 만들어집니다 ( StartupLoader.cs 참조).

또한 WebApplication.Run 메서드 ( WebApplication.Run )에서 ASP.NET 5 웹 응용 프로그램의 진입 점을 볼 수도 있습니다.

DI는 WebHostBuilder 클래스 ( WebHostBuilder.cs )에서 초기화되고 dnxBootstrapper 클래스 ( Bootstrapper.cs )에서 초기화됩니다.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.