あなたがASP.NET 5にいない場合、EF7依存性注入(IServiceCollection)をブートストラップする方法は?

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

質問

私はまだASP.NET 5 / EF 7で何が起ころうとしているのか考えようとしています。私はDNXプロジェクト(.xproj)を使用しています。

StartupはOWIN / ASP.NETによって構成、ロードサービスなどに使用されStartupが、EF 7の移行(たとえばDbContextOptions設定)にも使用されます。

私の主な目標は、EF7(とASP.NET 5)がStartupどのようにブートストラップし、誰がスタートアップクラスを作成し、DIコンテナを初期化するかなどを知ることです。

コンテキストのために私がしなければならないことの例は、xUnit単体テスト(独自のアセンブリにあり、 Startupクラスを持たないデータアセンブリを参照してい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の全体的なメカニズムを理解したいと思っていStartup 。しかし、今のところ、ユニットテストを適切に初期化できるように、EF 7が依存関係/サービスをどのように初期化するかを理解する必要があります。

UPDATEこれまでの私の単体テストでは何が得られましたか?私はそれが一点で働いていると思いました:

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

今では私のDbContextがインスタンス化No service for type 'Microsoft.Data.Entity.Internal.IDbSetInitializer' has been registeredれるときにNo 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.ServiceProvider設定するのはDbContextActivator.ServiceProviderの唯一の場所で、自分のプロバイダを設定するためのフックを見つけることができます。私はEF7の内部サービスコレクションのインスタンスを取得してそれを使用することも幸いです。私はEF7ユニットのテストコードをもう一度見直して、私が重要な部分を欠いているかどうかを確認するつもりです。

受け入れられた回答

Startupクラスは、Webアプリケーションを実行するときにMicrosoft.AspNet.Hostingパッケージによって作成されます( StartupLoader.csを参照)。

また、 WebApplication.Runメソッド( WebApplication.Run )を参照して、ASP.NET 5 Webアプリケーションのエントリポイントを参照することもできます。

DIがで初期化されWebHostBuilderクラス( WebHostBuilder.cs )と内部dnxにおけるBootstrapperクラス( Bootstrapper.cs



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ