Est-ce de l'entité Personnalisée dans la Base de Contrôleur ASP.NET MVC 3 terriblement inefficace?

Malgré le fait que j'ai été ici pendant un certain temps, c'est ma première question, de sorte s'il vous plaît être gentil avec moi.

Je suis en utilisant ASP.NET MVC 3 et je veux créer un personnalisé Principal donc je peux stocker un peu plus d'infos sur l'utilisateur courant que ce qui est standard, donc pas besoin d'aller à la base de données trop souvent. C'est assez standard des trucs que je suis après. Disons simplement un e-mail l'adresse et le nom d'utilisateur dans la première instance.

J'ai décidé de ranger l'objet dans le cache que je suis conscient qu'il n'est pas conseillé de le stocker dans la session.

Je ne veux pas avoir à faire un moulage de la User objet, donc j'ai voulu remplacer la User objet dans le contrôleur. Si je peux juste aller User.UserId et sont garantis de quelque chose.

J'ai donc créé une entité personnalisée comme ceci:

public class MyPrincipal : IPrincipal
{
    public MyPrincipal(IIdentity ident, List<string> roles, string email, Guid userId)
    {
        this._identity = ident;
        this._roles = roles;
        this._email = email;
        this._userId = userId;
    }

    IIdentity _identity;

    public IIdentity Identity
    {
        get { return _identity; }
    }

    private List<string> _roles;

    public bool IsInRole(string role)
    {
        return _roles.Contains(role);
    }

    private string _email;

    public string Email
    {
        get { return _email; }
    }

    private Guid _userId;

    public Guid UserId
    {
        get { return _userId; }
    }
}

Et j'ai un Contrôleur de Base comme ceci:

public class BaseController : Controller
    {
        protected virtual new MyPrincipal User
        {
            get
            {
                if (base.User is MyPrincipal)
                {
                    return base.User as MyPrincipal;
                }
                else
                {
                    return new MyPrincipal(base.User.Identity, new List<string>(0), "", Guid.Empty );
                }
            }
        }

        protected override void OnAuthorization(AuthorizationContext filterContext)
        {
            if (User != null)
            {
                if (User.Identity.IsAuthenticated)
                {
                    if (User.Identity is FormsIdentity)
                    {
                        FormsIdentity id = base.User.Identity as FormsIdentity;
                        MyPrincipal principal = (MyPrincipal)filterContext.HttpContext.Cache.Get(id.Name);
                        if (principal == null)
                        {
                            MembershipUser user = Membership.GetUser();

                            //Create and populate your Principal object with the needed data and Roles.
                            principal = new MyPrincipal(id, Roles.GetRolesForUser(id.Name).ToList(), user.Email, (Guid)user.ProviderUserKey);
                            filterContext.HttpContext.Cache.Add(
                            id.Name,
                            principal,
                            null,
                            System.Web.Caching.Cache.NoAbsoluteExpiration,
                            new System.TimeSpan(0, 30, 0),
                            System.Web.Caching.CacheItemPriority.Default,
                            null);
                        }
                        filterContext.HttpContext.User = principal;
                        System.Threading.Thread.CurrentPrincipal = principal;
                        base.OnAuthorization(filterContext);
                    }
                }
            }
        }
    }

Si vous avez un coup d'oeil vous allez vite réaliser que si l'utilisateur n'est pas connecté alors tout appel à la User objet avez à courir à travers ce morceau de code:

return new MyPrincipal(base.User.Identity, new List<string>(0), "", Guid.Empty );

et cela se sent terriblement inefficace pour moi, même si c'est seulement à la création d'objets vides pour le manque des trucs.

Il fonctionne très bien.

Donc je suppose que je veux savoir si c'est réellement bon et que je devrais arrêter d'être si anale sur les performances et l'efficacité, ou si mes craintes sont corrects, dans ce cas que dois-je faire à la place? [Merci de ne pas dire "faire une vie, mate!"]

N'oubliez pas Knuth... "optimisation Prématurée est la racine de tous les maux." C'est-à-dire, avez-vous réellement vu les problèmes de performances?
+1 une Belle. Non, je n'ai pas. Mais le truc c'est que je me sentais assez intelligent pour avoir fait tout le travail jusqu'à ce que j'ai regardé le méchant ligne de code! Wow! Je suis vraiment anal! Je suppose que c'est ce que vient d'avoir commencé à coder sur la BBC Micro, où les cycles d'horloge ont été peu nombreuses et espacées...

OriginalL'auteur Tom Chantler | 2011-11-25