我正在使用带有asp.net身份的asp.net核心mvc。
我的ApplicationUser
有一个属性:Country
=> 'GB'或'FR'等...
我想将System.Threading.Thread.CurrentThread.CurrentCulture
设置为从applicationUser.Country
读取的值。在我的视图中正确显示所有日期时间/数字值,由用户设置。
因此我创建了这个动作过滤器:
public class LanguageActionFilter : ActionFilterAttribute
{
private readonly ILogger _logger;
private UserManager<ApplicationUser> _userManager;
public LanguageActionFilter(ILoggerFactory loggerFactory, UserManager<ApplicationUser> userManager)
{
_logger = loggerFactory.CreateLogger("LanguageActionFilter");
_userManager = userManager;
}
public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
var user = await _userManager.GetUserAsync(context.HttpContext.User);
Thread.CurrentThread.CurrentCulture = new CultureInfo(user.Country);
await base.OnActionExecutionAsync(context, next);
}
}
在设置此actionfilter的操作/控制器上,我还运行以下代码:
public async Task<IActionResult> Index()
{
var user = await this.userManager.GetUserAsync(User);
var todos = await service.GetTodosAsync(user.Id);
return View(todos);
}
目前我致电this.userManager.GetUserAsync(User);
两次!
然后我考虑将用户对象传递给
context.HttpContext.Items.Add("applicationUser", user);
并在Index() action
方法中再次抓取此用户对象:
var user = (ApplicationUser)base.HttpContext.Items["applicationUser"];
这有用,但这是个好主意吗?你觉得这种方法有什么问题吗?
答案 0 :(得分:1)
你做的很好......
我引用了HttpContext类的定义:
{{1}}
答案 1 :(得分:0)
编辑:似乎ef核心不支持第一级缓存。所以我的想法一无所获
您的代码有效,但我认为您不会获得相当大的性能。
您可能在实体框架中使用aspnet标识。由于ef支持first level cache。 ,如果你多次调用this.userManager.GetUserAsync(User);
,ef只从数据库中检索一次用户实体。因此,两种方式对性能的影响大致相同。我不会在你的情况下使用HttpContext.Items
。