MVC 5 - 检索ApplicationUser对象

时间:2014-12-09 10:53:20

标签: memory asp.net-mvc-5 entity-framework-6 asp.net-identity-2 user-object

我正在开发一个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对象时都不需要担心内存/带宽?

提前致谢。

1 个答案:

答案 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()

这是非常快速的查找,无法进入您的数据库。