如何在ASP.NET Core中的自定义本地化提供程序中注入DbContext?

时间:2016-07-25 16:39:45

标签: localization asp.net-core

asp.net core docs中所述,您可以为请求本地化配置自定义提供程序。正如文档中所述:

  

假设您希望让您的客户在数据库中存储他们的语言和文化。您可以编写提供程序来为用户查找这些值。

为此,文档和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");
}));});

有人可以解释一下如何在上面的函数中注入DbContext从DB加载用户特定的语言吗?

1 个答案:

答案 0 :(得分:8)

好吧,你不能通过构造函数注入它,因为你需要在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>();
    }
}

请注意,这可能不是最佳,因为您将在每个请求上调用数据库,因此可能需要进一步抽象并使用缓存策略,具体取决于您对{的确切要求{ {1}}。

出于性能原因,通常应该避免在文化提供程序,过滤器等中进行数据库调用

<强>更新

DbContext的通用版本,但您需要通过GetService<T>导入名称空间。