2016-07-25 9 views
1

asp.net core docsで説明したように、リクエストのローカライズ用にカスタムプロバイダをコンフィグレーションできます。ドキュメントに記載されているとおり:ASP.NET CoreのカスタムローカリゼーションプロバイダにDbContextを挿入する方法は?

データベースに言語とカルチャを保存させたいとします。あなたは、ユーザーのためにこれらの値を参照するプロバイダを書くことができます。

次のコードスニペットは、ドキュメントで提供されており、また、githubのサンプルLocalization.StarterWebであることを示します。

services.Configure<RequestLocalizationOptions>(options => { 
var supportedCultures = new[] 
{ 
    new CultureInfo("en-US"), 
    new CultureInfo("fr") 
}; 

options.DefaultRequestCulture = new RequestCulture(culture: "en-US", uiCulture: "en-US"); 
options.SupportedCultures = supportedCultures; 
options.SupportedUICultures = supportedCultures; 

options.RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(async context => 
{ 
    // My custom request culture logic 
    // DbContext needed here <-- 
    return new ProviderCultureResult("en"); 
}));}); 

誰がでDBからユーザー固有の言語をロードするためにDbContextを注入する方法を私に説明できます上記の機能は?

答えて

3

ConfigureServicesメソッド中にインスタンス化する必要があり、この時点でコンテナが利用できないため、コンストラクタを介して注入することはできません。

代わりにHttpContextで解決できます。

public class CustomRequestCultureProvider : RequestCultureProvider 
{ 
    // Note we don't inject any dependencies into it, so we can safely 
    // instantiate in ConfigureServices method 
    public CustomRequestCultureProvider() { } 

    public override Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext) 
    { 
     var dbContext = httpContext.RequestServices 
      .GetService<AppDbContext>(); 
    } 
} 

あなたはすべてのリクエストに応じてデータベースへの呼び出しがあるでしょう、これは、最適未満であってもよいので、多分それはこれをさらに抽象的に価値があるとあなたがしたい正確に何に応じて、キャッシュ戦略を使用することにかかわらず、注意してくださいDbContextで行ってください。

通常1は、パフォーマンス上の理由などのフィルタ、文化プロバイダにおけるデータベース呼び出しを避ける必要があり

更新:

ありGetService<T>のジェネリック版であるが、あなたはusing Microsoft.Extensions.DependencyInjection;経由で名前空間をインポートする必要があります。

+0

多くのお返事をいただきありがとうございます。あなたの提供されたコードサンプルには2つの小さな間違いがあります:コンストラクタの前に 'class'キーワードがあり、メソッド' GetService'がジェネリックでないため、GetService(typeof(AppDbContext));を呼び出さなければなりません; – MDummy

+0

'GetService ' – Tseng

+0

'GetService 'の使い方を明確にしてくれてありがとう – MDummy

関連する問題