我正在开发一个MVC 5互联网应用程序,并对ApplicationUser
对象中的自定义对象有疑问。
我在public virtual Account account
对象中有一个ApplicationUser
对象,它为我的MVC 5应用程序中的对象保存了许多最大计数变量。当用户注册帐户时,为每个用户设置此项。
在创建模型对象之前,我检查用户是否未超过模型对象的最大计数。这是在对象的服务类中完成的。
以下是用于文件对象的代码示例:
var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
ApplicationUser user = userManager.FindByNameAsync(userName).Result;
int maxFiles = user.account.maxFiles;
我为许多具有相似代码的对象使用了许多服务类来检索ApplicationUser
对象。
我的问题是:每次为每个服务类检索ApplicationUser
对象,而不是在用户登录时存储该对象,然后在模型对象之前引用该对象。产生的?如果是这样,我可以在哪里存储此对象用于上述目的?
此外,检索ApplicationUser
对象时使用了多少内存/带宽?是否使用了最小的内存/带宽,以便在创建模型对象之前每次检索ApplicationUser
对象时都不需要担心内存/带宽?
提前致谢。
答案 0 :(得分:0)
这是添加具有登录身份值的声明的典型案例。
当用户登录时,使用此值添加声明。然后,此声明的值将保留在Cookie中。并且每次用户回来时都可以使用,这对于cookie身份验证来说都是非常快速的查找。
要将此声明添加到身份,您需要覆盖CreateIdentityAsync
上的ApplicationUserManager
方法:
public override async Task<ClaimsIdentity> CreateIdentityAsync(ApplicationUser user, string authenticationType)
{
var identity = await base.CreateIdentityAsync(user, authenticationType);
identity.AddClaim(new Claim("MyApplication:maxFiles", user.account.maxFiles));
return identity;
}
然后要访问它,您可以创建一个扩展方法:
public static int GetMaxFiles(this IPrincipal principal)
{
if (principal == null)
{
throw new ArgumentNullException("principal");
}
var claimsPrincipal = principal as ClaimsPrincipal;
if (claimsPrincipal == null)
{
throw new DomainException("User is not authenticated or IPrincipal is not ClaimsPrincipal");
}
var claim = claimsPrincipal.Claims.FirstOrDefault(c => c.Type == "MyApplication:maxFiles");
int maxfiles = 0;
if(int.TryParse(claim.Value, out maxfiles))
{
return maxfiles;
}
throw new Exception("Claim value is not an integer")
}
在您的应用程序中,您可以将其用作var maxFiles = HttpContext.Current.User.GetMaxFiles()
。或者,如果它是控制器或视图,则可以执行var maxFiles = User.GetMaxFiles()
。
这是非常快速的查找,无法进入您的数据库。