2010-07-09 3 views
7

asp.net에서 IPrincipal을 확장하여 내가 정의 할 사용자 유형을 얻을 수있게하고 싶습니다. 나는 그것이 가능한 내가asp.net extend IPrincipal

나는이 작업을 수행 할 수있는 방법을
public string UserType() 
{ 
    // do some database access 
    return userType 

} 

같은 방법이있을 것이다 내 확장 방법에 컨트롤러 다음

string type = User.UserType 

에서이 작업을 수행 할 수 있도록 하시겠습니까? 그것은 가능한가? 감사합니다.

+0

당신은 당신이 그것을 구현하는 인터페이스를 확장하지 않습니다. –

+0

또는 확장 할 수도 있지만 그 밖의 것이 있습니다. 그러면 기본 인터페이스의 상위 집합 인 새 인터페이스가 만들어집니다. –

답변

10

당신은 확장 메서드를 만들 수 있습니다

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

그것은 영리하지만 위험 할 것입니다. "반환 무언가"부분은 실제로 그의 구현에 그것을 버리고 일부 속성을 호출해야합니다. 이것은 다른 IPrincpal 구현에서 실행될 경우 실패합니다. –

+0

이 확장 메서드가있는 클래스를 어떻게 보이게해야합니까? – twal

+1

'정적 클래스'여야합니다. – SLaks

2

다음은 IPrincipal을 구현하는 예제 사용자 정의 클래스입니다. 이 클래스에는 역할 제휴를 확인하는 몇 가지 추가 메서드가 있지만 요구 사항에 따라 UserType이라는 속성이 표시됩니다.

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

IPrincipal에 대한 참조가있는 경우 UserType을 호출 할 수 없다는 점을 제외하고는 오른쪽. –

2

기본적으로 아니요. 을 MyPrincipal과 같은 클래스로 구현할 수 있으며 그 클래스는 UserType 속성을 가질 수 있지만 인터페이스 참조가 아닌 도달하기 위해서는 고유 한 유형의 참조를 통해 인스턴스에 액세스해야합니다.

편집

연장 방법 일 수 있지만, 당신이 절대적으로 확신하는 경우에만이 IPrincipal를 구현하지만, 자신의 클래스의 인스턴스가 아닌 뭔가를 호출하지 않을 것이다.

+0

감사합니다. 나는 IPrincipal이 다른 곳에서 구현 될 가능성에 대해 생각할 것입니다. 나는 그것이 내 신청서에 있는지 확실하지 않습니다. 나는 이것이 어떤 시나리오에서 일어날 지 확신하지 못한다. 하지만 그렇다면 그것을 구현하는 것도 나를 위해 작동 할 것입니다. 감사합니다! – twal

+0

@twal : 종종 프레임 워크는 IPrincipal을 전달합니다. 그 구현은 해당 프레임 워크의 일부 클래스입니다. 이렇게 될 수 없다는 확신이있는 한, 확장 방법이 귀하의 필요를 채울 것입니다. –

+0

스티븐 감사합니다! – twal

3

확실히. 클래스는 IPrincipal 구현합니다

public class MyPrinciple : IPrincipal { 
    // do whatever 
} 

확장 방법 :

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

SLaks의 대답과 같은 문제 : "무언가"가 다운 캐스팅과 관련되어 실패 할 수 있습니다. –

관련 문제