2017-03-24 9 views
1

スタートアップクラスの依存関係をどのように使用するのが適切なのでしょうか?スタートアップからの依存関係を消費する

私は自分のアプリケーションを構成し、私は次のと呼ばれているconfigureメソッドでは、このコンテキストを消費する必要があるサービスで

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddEntityFramework().AddDbContext<ApplicationContext>(options => 
             options.UseSqlServer(connection)); 
} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions 
    { 
     Authority = "https://localhost:4430", 
     RequireHttpsMetadata = false, 

     ApiName = "api", 
     JwtBearerEvents = new SyncUserBearerEvent() 
     { 
      OnTokenValidated = async tokenValidationContext => 
      { 

        var claimsIdentity = tokenValidationContext.Ticket.Principal.Identity as ClaimsIdentity; 
        if (claimsIdentity != null) 
        { 
         // Get the user's ID 
         string userId = claimsIdentity.Claims.FirstOrDefault(c => c.Type == "sub").Value; 

        } 

        //I need to spawn a context here 

       } 
      } 
     } 
    }); 
} 

をコンテキストを追加しました。私は新しいDbContextを作成するいくつかを読んで、それは適切ではなく、私たちのサービスから消費されるべきです。

起動方法で新しいDbコンテキストを使用する適切な方法は何ですか?

答えて

2

ConfigureServicesメソッドに登録された依存関係は、ConfigureServicesメソッド呼び出しが完了するとすぐに使用できます。 ConfigureメソッドはConfigureServicesの後に起動されるので、メソッドの中でそれらを新しいものにする代わりに、パラメータ注入を使用してConfigureメソッドで登録された依存関係を使用することができます。シングルトンだけが必要な場合は、以下のようにConfigureメソッドでサービスを注入できます。

public void Configure(IApplicationBuilder app, 
         IHostingEnvironment env, 
         ILoggerFactory loggerFactory, 
         IDependentService service) 
{ 
     //You can use dbContext here. 
} 

またそうのようなアプリのサービスからあなたのコンテキストを起動することができます:あなたがdbContextが必要な場合は

var dependentService = app.ApplicationServices.GetRequiredService<IDependentService>()) 

は、あなたがのHttpContextかかわらず提供するサービスにアクセスする必要があります。あなたはインスタンスであるので、あなたはTokenValidatedContextを通してそれにアクセスできます。これは、以下のように渡されます:

var serviceProvider = tokenValidationContext.HttpContext.RequestServices; 
using (var context = serviceProvider.GetRequiredService<AstootContext>()) 
{ 
} 
+0

なぜ、どのように説明するか? –

+0

興味深いことに、これが機能するかどうかを確認する必要がありますが、これは上記のOnTokenValidatedメソッドで使用されており、IDはアプリケーションの全期間にわたって開いていないことを好みます。 –

+0

@ johnny5:AddDbContextの3番目のパラメータはServiceLifetimeです。私はあなたのコンテキストがアプリケーションの寿命のために開いていないと思うので、 "スコープ"としてデフォルト値を持っています。 –

関連する問題