2010-07-09 4 views
7

Ich möchte IPrincipal in asp.net erweitern, um mir zu ermöglichen, den Usertyp zu erhalten, den ich definieren werde. Ich mag es möglich macht dieseasp.net extending IPrincipal

string type = User.UserType 

dann in meiner Erweiterung Methode zu tun in einem Controller i eine Methode, wie

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

} 

wie kann ich das tun? ist es möglich? Danke!

+0

Sie erstrecken sich nicht über eine Schnittstelle, können Sie es implementieren. –

+0

Oder eher, es ist möglich, es zu erweitern, aber das ist etwas anderes. Das würde eine neue Schnittstelle schaffen, die eine Obermenge der Basis ist. –

Antwort

10

Sie können eine Verlängerung Methode machen:

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

Das wäre schlau, aber riskant. Der Teil "etwas zurückgeben" müsste ihn tatsächlich auf seine Implementierung reduzieren und eine Eigenschaft aufrufen. Dies würde fehlschlagen, wenn es auf einer anderen IPrincpal-Implementierung ausgeführt wird. –

+0

Wie muss die Klasse aussehen, in der diese Erweiterungsmethode gefunden wird? – twal

+1

Es muss eine 'statische Klasse' sein. – SLaks

2

Hier ist ein Beispiel für eine benutzerdefinierte Klasse, die IPrincipal implementiert. Diese Klasse enthält einige zusätzliche Methoden zum Überprüfen der Rollenzugehörigkeit, zeigt jedoch eine Eigenschaft namens UserType gemäß Ihren Anforderungen.

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; 
     } 
    } 

    } 

Viel Spaß!

+0

Richtig, außer dass sie UserType bei einem Verweis auf IPrincipal nicht aufrufen konnten. –

2

Grundsätzlich keine. Sie können IPrincipal mit einer Klasse wie MyPrincipal implementieren, und diese Klasse kann eine UserType-Eigenschaft haben, aber Sie müssten auf die Instanz über eine Referenz ihres eigenen Typs zugreifen, um sie zu erreichen, nicht über die Schnittstellenreferenz.

bearbeiten

Eine Erweiterung Methode könnte funktionieren, aber nur, wenn Sie absolut sicher sind, werden Sie es nie auf etwas nennen, die IPrincipal implementiert, ist aber nicht eine Instanz Ihrer eigenen Klasse.

+0

Danke. Ich werde über die Chancen nachdenken, dass IPrincipal woanders implementiert wird. Ich bin mir nicht sicher, ob es jemals auf meine Bewerbung kommen wird. Ich bin mir nicht sicher, welche Szenarien das verursachen würden. Aber wenn es so wäre, würde die Umsetzung auch für mich funktionieren. Danke mein Herr! – twal

+0

@ twal: Oft übergibt Ihnen das Framework ein IPrincipal, dessen Implementierung eine Klasse aus diesem Framework ist. Solange Sie sicher sind, dass dies nicht passieren wird, wird eine Erweiterungsmethode Ihre Bedürfnisse erfüllen. –

+0

Danke Steven! – twal

3

Sicher. Machen Sie Ihre Klasse IPrincipal implementiert:

public class MyPrinciple : IPrincipal { 
    // do whatever 
} 

Erweiterungsmethode:

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

Das gleiche Problem wie die Antwort von SLaks: Das "Etwas tun" wird Downcasting beinhalten, was fehlschlagen kann. –