2010-07-09 19 views
7

IPRincipal'ı asp.net'e genişletmek ve tanımlayacağım kullanıcı türünü elde etmeme izin vermek istiyorum. Bunun mümkün ıasp.net IPrincipal'i genişletme

ben bunu nasıl
public string UserType() 
{ 
    // do some database access 
    return userType 

} 

gibi bir yöntem olacaktır Uzantımın yönteminde bir denetleyici sonra

string type = User.UserType 

bunu yapmak isterdiniz? mümkün mü? Teşekkürler!

+0

Sen bunu uygulamak, bir arayüz uzatmaz. –

+0

Veya daha doğrusu onu genişletmek mümkün, ama bu başka bir şey. Bu, üssün bir üst kümesi olan yeni bir arayüz oluşturacaktı. –

cevap

10

Sen bir uzantısı yöntemi yapabilirsiniz:

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

Bu zeki, ancak riskli olurdu. “Bir şeyleri geri getir” kısmı aslında onu uygulamaya indirgemek ve bazı mülkleri aramak zorunda kalacaktır. Başka bir IPrincpal uygulamasında gerçekleştirilirse başarısız olur. –

+0

Sınıfın, bu uzantı yönteminin bulunduğu gibi nasıl görünmesi gerekiyor? – twal

+1

Bir "statik sınıf" olması gerekiyor. – SLaks

2

IPrincipal'i uygulayan örnek bir özel sınıf. Bu sınıf, rol ilişkilendirmeyi kontrol etmek için birkaç ek yöntem içerir, ancak gereksinimlerinize göre UserType adlı bir özellik gösterir.

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

    } 

+0

Doğru, IPrincipal'a bir başvuru yapıldığında UserType'ı aramadıklarından. –

2

Temel olarak, hayır. 'u MyPrincipal gibi bir sınıfla uygulayabilirsiniz ve bu sınıf bir UserType özelliğine sahip olabilir, ancak örneğe, arabirim başvurusu aracılığıyla değil, ulaşmak için kendi türüne ait bir başvuru yoluyla erişmeniz gerekir.

düzenlemek

bir uzantısı yöntemi işe yarayabilir, ancak kesinlikle emin olmanın tek eğer IPrincipal uygular ama kendi sınıfının bir örneği olmayan bir şey üzerinde diyoruz asla.

+0

Teşekkür ederiz. IPrincipal'in başka bir yerde uygulanma şansını düşüneceğim. Başvurumda olup olmayacağından emin değilim. Hangi senaryoların buna sebep olacağından emin değilim. Ama eğer öyleyse, uygulama benim için de işe yarayacaktı. Teşekkürler bayım! – twal

+0

@twal: Çoğunlukla, çerçeve, uygulaması bu çerçeveden bir sınıf olan bir IPrincipal'i size verir. Bu olmayacağından emin olduğunuz sürece, bir uzantı yöntemi ihtiyaçlarınızı karşılayacaktır. –

+0

Teşekkür ederim Steven! – twal

3

Elbette. Sınıf IPrincipal uygular olun:

public class MyPrinciple : IPrincipal { 
    // do whatever 
} 

Uzatma yöntemi:

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

SLaks'ın cevabı gibi aynı problem: "bir şey yap", düşüş yaşayabilecek, bu da başarısız olabilir. –