如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加载用户特定的语言吗?
答案 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>
导入名称空间。