2014-01-21 1 views
3

클래스의 몇 가지 속성에서 보안을 관리하기 위해 애스펙트를 만들려고합니다. 그러나 한 구성원의 보안 측면은 클래스의 다른 속성에있는 데이터에 의존합니다. IntroduceAspect에 대한 자습서를 읽었지만 필자가 필요로하는 것은 아닌지 잘 모르겠습니다.인스턴스 멤버를 사용하여 날카로운 채우기

public class ClassWithThingsIWantToSecure 
{ 

    [SecurityAspectHere(inherits from LocationInterceptionAspect)] 
    public int ThingIWantToSecure; 

    public string ThingINeedToKnowAboutInSecurityAspect; 
} 

누군가가 SecurityAspect에 ThingINeedToKnowAboutInSecurityAspect 사용할 수의 런타임 값을 만들기위한 올바른 방향으로 날 포인트? 는 그래서 ...

class Program 
{ 
    static void Main(string[] args) 
    { 
     Baldrick baldrick = new Baldrick(); 
     baldrick.ThingINeedToKnowAboutInSecurityAspect = "Bob"; 
     Console.WriteLine("There are {0} beans", baldrick.ThingIWantToSecure); 

     baldrick.ThingINeedToKnowAboutInSecurityAspect = "Kate"; 

     try 
     { 
      //This should fail 
      Console.WriteLine("There are {0} beans", baldrick.ThingIWantToSecure); 
     } 
     catch (Exception ex) 
     { 
      //Expect the message from my invalid operation exception to be written out (Use your own exception if you prefer) 
      Console.WriteLine(ex.Message); 
     } 
     Console.ReadLine(); 
    } 


} 

[Serializable] 
public class SecurityAspect : LocationInterceptionAspect 
{ 
    public override void OnGetValue(LocationInterceptionArgs args) 
    { 
     ISecurityProvider securityProvider = args.Instance as ISecurityProvider; 
     if (securityProvider != null && securityProvider.ThingINeedToKnowAboutInSecurityAspect != "Bob") 
      throw new InvalidOperationException("Access denied (or a better message would be nice!)"); 
     base.OnGetValue(args); 
    } 
} 



public interface ISecurityProvider 
{ 
    string ThingINeedToKnowAboutInSecurityAspect { get; } 
} 

public class Baldrick : ISecurityProvider 
{ 
    public string ThingINeedToKnowAboutInSecurityAspect { get; set; } 

    [SecurityAspect] 
    public int ThingIWantToSecure{get { return 3; }} 
} 

답변

2

나는 여기에, 나는 그것을 밖으로 시도 방금 설치 postsharp있는 컴퓨터에서 테스트를 두드리고했습니다 전에 조금이 같은 짓을 한 코드는 여기서 생각하는 것은 데코 레이팅되는 객체의 인스턴스에 대한 args.Instance 속성을 조사하는 것입니다.