如果你不在ASP.NET 5中,EF7引導依賴注入(IServiceCollection)如何?

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

我仍然試圖了解ASP.NET 5 / EF 7的用途。我正在使用DNX項目(.xproj)。

OWIN / ASP.NET使用Startup來配置,加載服務等。但它也用於EF 7遷移(例如設置DbContextOptions )。

我的主要目標是了解EF7(和ASP.NET 5)如何使用Startup引導,以及誰在創建啟動類,初始化DI容器等。

對於上下文,我需要做的一個例子是,在我的xUnit單元測試中(它們在自己的程序集中並引用我沒有Startup類的數據程序集),我需要AddDbContext來設置我的連接。

我有示例啟動類:

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但我想我會試一試):

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

啟動類沒有被執行。

我真的很想了解Startup的整體機制,它會調用它等等,但是現在,我只需要了解EF 7如何初始化依賴項/服務,以便我可以正確地初始化我的單元測試。

更新這是我到目前為止在我的單元測試中得到的內容,我認為我有一點工作:

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"));

但是現在我在實例化我的DbContextNo service for type 'Microsoft.Data.Entity.Internal.IDbSetInitializer' has been registered 。顯然沒有加載所有EF服務。

如果我評論出來:

DbContextActivator.ServiceProvider = serviceProvider;

它之前的錯誤: 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.ServiceProviderDbContextActivator.ServiceProvider中唯一可以找到設置自己的提供者的鉤子的地方。我很高興獲得EF7內部服務集合的實例並使用它。我想我將再次搜索EF7單元測試代碼,看看我是否錯過了一個關鍵部分。

一般承認的答案

運行Web應用程序時, Microsoft.AspNet.Hosting包會創建Startup類(請參閱StartupLoader.cs )。

您還可以查看WebApplication.Run方法( WebApplication.Run ),它是ASP.NET 5 Web應用程序的入口點。

DI在WebHostBuilder類( WebHostBuilder.cs )中初始化,在Bootstrapper類( Bootstrapper.cs )中在dnx內部dnx



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow