2

我正在开发一个 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对于每个服务类,不是每次都检索对象,是否可以在用户登录时存储该对象,然后在创建模型对象之前引用该对象?如果是这样,我可以在哪里存储这个对象用于上述目的?

此外,检索对象时使用了多少内存/带宽ApplicationUserApplicationUser是否使用了最少的内存/带宽,这样我每次在创建模型对象之前检索对象时都不需要担心内存/带宽?

提前致谢。

4

1 回答 1

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().

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

于 2014-12-09T23:11:43.630 回答