Localization 如何在ASP.NET Core中的自定义本地化提供程序中插入DbContext?
如中所述,您可以为请求本地化配置自定义提供程序。如文件所述: 假设您想让客户在数据库中存储他们的语言和文化。您可以编写一个提供程序来为用户查找这些值 为此,文档和github示例中提供了以下代码片段: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
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