2016-07-25 14 views
1

Wie in der asp.net core docs erläutert, können Sie einen benutzerdefinierten Anbieter für die Anforderungslokalisierung konfigurieren. Wie in der Dokumentation angegeben:Wie injiziere ich DbContext in einem benutzerdefinierten Lokalisierungsanbieter in ASP.NET Core?

Angenommen, Sie möchten Ihre Kunden ihre Sprache und Kultur in Ihren Datenbanken speichern lassen. Sie könnten einen Anbieter schreiben, der diese Werte für den Benutzer sucht.

, die für den folgenden Codeausschnitt wird in der Dokumentation zur Verfügung gestellt und auch in der Github Probe 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"); 
}));}); 

Kann mich jemand erklären, wie man ein DbContext injizieren, um die benutzerspezifische Sprache von DB laden in die obige Funktion?

Antwort

3

Nun, Sie können es nicht über Konstruktor injizieren, weil Sie es während ConfigureServices Methode instanziieren müssen und der Container ist zu diesem Zeitpunkt nicht verfügbar.

Stattdessen können Sie über HttpContext lösen.

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>(); 
    } 
} 

Beachten Sie jedoch, dass dies nicht optimal sein kann, wie Sie Anrufe Datenbank auf jede Anfrage haben werden, so ist es vielleicht diese weiter zu abstrahieren wert und eine Caching-Strategie verwenden, je nachdem, was genau wollen Sie Tun Sie mit der DbContext.

Normalerweise sollte eine Datenbank Anrufe in Kulturanbieter, Filter usw. aus Leistungsgründen

aktualisieren vermeiden:

Es ist eine generische Version von GetService<T>, aber Sie müssen den Namespace über using Microsoft.Extensions.DependencyInjection; importieren.

+0

Vielen Dank für Ihre Antwort! Ihr bereitgestelltes Codebeispiel hat zwei kleine Fehler: das Schlüsselwort 'class' vor dem Konstruktor und die Methode' GetService' ist nicht generisch, daher müssen Sie 'GetService (typeof (AppDbContext))' aufrufen; ' – MDummy

+0

Die Frage wurde mit beiden Optionen aktualisiert fix und wie man den 'GetService ' – Tseng

+0

verwendet Danke für die Verdeutlichung der Verwendung von 'GetService ' – MDummy