2010-07-09 3 views
7

Je voudrais étendre IPrincipal dans asp.net pour me permettre d'obtenir le type d'utilisateur que je vais définir. Je voudrais rendre possible de le faire dans un contrôleurasp.net extension IPrincipal

string type = User.UserType 

puis dans ma méthode d'extension, je vais avoir une méthode comme

public string UserType() 
{ 
    // do some database access 
    return userType 

} 

comment puis-je faire cela? c'est possible? Merci!

+0

Vous n'étendent pas une interface, vous le mettre en œuvre. –

+0

Ou, plutôt, il est possible de l'étendre, mais c'est autre chose. Ce serait créer une nouvelle interface qui est un sur-ensemble de la base. –

Répondre

10

Vous pouvez faire une méthode d'extension:

public static string UserType(this IPrincipal principal) { 
    // do some database access 
    return something; 
} 
+0

Ce serait intelligent, mais risqué. La partie "retourner quelque chose" devrait en fait la baisser vers son implémentation et appeler une propriété. Cela échouerait s'il était exécuté sur n'importe quelle autre implémentation IPrincpal. –

+0

À quoi doit ressembler la classe dans laquelle cette méthode d'extension est trouvée? – twal

+1

Il doit être une 'static class'. – SLaks

2

Voici un exemple de classe personnalisée qui implémente IPrincipal. Cette classe inclut quelques méthodes supplémentaires pour vérifier l'affiliation de rôle, mais montre une propriété nommée UserType selon vos besoins.

public class UserPrincipal : IPrincipal 
    { 
    private IIdentity _identity; 
    private string[] _roles; 

    private string _usertype = string.Empty; 


    public UserPrincipal(IIdentity identity, string[] roles) 
    { 
     _identity = identity; 
     _roles = new string[roles.Length]; 
     roles.CopyTo(_roles, 0); 
     Array.Sort(_roles); 
    } 

    public IIdentity Identity 
    { 
     get 
     { 
     return _identity; 
     } 
    } 

    public bool IsInRole(string role) 
    { 
     return Array.BinarySearch(_roles, role) >= 0 ? true : false; 
    } 

    public bool IsInAllRoles(params string[] roles) 
    { 
     foreach (string searchrole in roles) 
     { 
     if (Array.BinarySearch(_roles, searchrole) < 0) 
     { 
      return false; 
     } 
     } 
     return true; 
    } 

    public bool IsInAnyRoles(params string[] roles) 
    { 
     foreach (string searchrole in roles) 
     { 
     if (Array.BinarySearch(_roles, searchrole) > 0) 
     { 
      return true; 
     } 
     } 
     return false; 
    } 

    public string UserType 
    { 
     get 
     { 
     return _usertype; 
     } 
     set 
     { 
     _usertype = value; 
     } 
    } 

    } 

Profitez-en!

+0

Droit, sauf qu'ils ne pouvaient pas appeler UserType donné une référence à IPrincipal. –

2

Fondamentalement, non. Vous pouvez implémenter IPrincipal avec une classe telle que MyPrincipal, et cette classe peut avoir une propriété UserType, mais vous devez accéder à l'instance via une référence de son propre type pour l'atteindre, et non via la référence d'interface.

modifier

Une méthode d'extension pourrait fonctionner, mais seulement si vous êtes absolument certain que vous ne serez jamais l'appeler sur quelque chose qui implémente IPrincipal mais n'est pas une instance de votre propre classe.

+0

Merci. Je réfléchirai aux chances qu'IPrincipal soit implémenté ailleurs. Je ne suis pas sûr que ce sera jamais sur ma demande. Je ne suis pas sûr de ce que les scénarios pourraient causer cela. Mais si c'est le cas, la mise en œuvre fonctionnerait également pour moi. Merci Monsieur! – twal

+0

@twal: Souvent, le framework vous remet un IPrincipal dont l'implémentation est une classe de ce framework. Tant que vous êtes certain que cela n'arrivera pas, une méthode d'extension comblera vos besoins. –

+0

Merci Steven! – twal

3

Bien sûr. Faites votre classe implémente IPrincipal:

public class MyPrinciple : IPrincipal { 
    // do whatever 
} 

méthode d'extension:

public static string UserType(this MyPrinciple principle) { 
    // do something 
} 
+0

Même problème que la réponse de SLaks: le "faire quelque chose" va impliquer le downcasting, qui peut échouer. –

Questions connexes