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

Localization 如何在ASP.NET Core中的自定义本地化提供程序中插入DbContext?,localization,asp.net-core,Localization,Asp.net Core,如中所述,您可以为请求本地化配置自定义提供程序。如文件所述: 假设您想让客户在数据库中存储他们的语言和文化。您可以编写一个提供程序来为用户查找这些值 为此,文档和github示例中提供了以下代码片段: services.Configure(选项=>{ var supportedCultures=new[] { 新文化信息(“美国”), 新文化信息(“fr”) }; options.DefaultRequestCulture=newrequestculture(culture:“en-US”,ui

如中所述,您可以为请求本地化配置自定义提供程序。如文件所述:

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

为此,文档和github示例中提供了以下代码片段:

services.Configure(选项=>{
var supportedCultures=new[]
{
新文化信息(“美国”),
新文化信息(“fr”)
};
options.DefaultRequestCulture=newrequestculture(culture:“en-US”,uiCulture:“en-US”);
options.SupportedCultures=SupportedCultures;
options.supportedCultures=supportedCultures;
options.RequestCultureProviders.Insert(0,新的CustomRequestCultureProvider(异步上下文=>
{
//我的自定义请求文化逻辑

//这里需要DbContext好吧,您不能通过构造函数注入它,因为您需要在
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>();
    }
}
公共类CustomRequestCultureProvider:RequestCultureProvider { //注意,我们不向其中注入任何依赖项,因此我们可以安全地 //在ConfigureServices方法中实例化 公共CustomRequestCultureProvider(){} 公共覆盖任务确定ProviderCultureResult(HttpContext HttpContext) { var dbContext=httpContext.RequestServices .GetService(); } }
请注意,这可能不是最佳的,因为每个请求都有对数据库的调用,所以可能需要进一步抽象这一点,并根据您对
DbContext
的具体操作使用缓存策略

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>();
    }
}
出于性能原因,通常应避免在区域性提供程序、筛选器等中调用数据库

更新:


有一个通用版本的
GetService
,但是您需要使用Microsoft.Extensions.DependencyInjection;

通过
导入名称空间。非常感谢您的回答!您提供的代码示例有两个小错误:构造函数前面的
class
关键字和方法
GetService
不是g因此您必须调用
GetService(typeof(AppDbContext));
更新了问题,包括修复和如何使用
GetService
感谢您澄清
GetService