2012-09-15 240 views
0

我現在有一個自定義屬性,我不知道如何限制對我應用了我的屬性的方法的訪問。處理自定義屬性

例如:如果CustomRole的值是"Admin",那麼只有它應該訪問方法,我現在有自定義屬性,如"CustomRole"

CustomRole["Admin"] 
public void Method() 
{ 
    // code 
} 

如何執行驗證的價值?

回答

0

您需要某種aspect oriented programming的方法。由於屬性本身不能被運行時評估,因此屬性本身無法「訪問」,但是您可能會使用一些攔截該調用的框架,檢查屬性和上下文並正確處理該案例。

因此,在短期,你會:

  • 裝飾與屬性
  • 的方法提供了一個攔截器通過提供AOP功能
  • 執行一些工具來處理呼叫
  • 實例化類電話。

    [RequiredPermission(Permissions.CanCreateOrder)] 
    public virtual Guid CreateOrder(string orderCode) {...} 
    

    截獲通話:呼叫將根據您的實現

指定要求

正如你已經指出的,這可以很容易地與屬性指定的被截獲並處理

現在你需要選擇一個工具來實例化你的對象並截獲對它的調用。這可以使用支持AOP的IoC容器完成,也可以手動包裝(例如,使用AOP工具爲對象創建代理並使用代理)。

您需要編寫一個攔截器或者一個包裝方法,它有機會在將執行轉發給您的方法或拒絕調用之前評估呼叫上下文。

您可以find a discussion and code samples here。看看通過屬性聲明需求的OrderManagementService類。

窮人的AOP

你可以做到這一切,而不訴諸適當的AOP工具,但在一個不太通用的方法(這可能是比較簡單的項目完全正常),使用某種形式的Decorator模式 - 請注意,這是從頭寫的,不是在IDE中:

interface IService 
{ 
    void Method(); 
} 

class ServiceImpl : IService // one of many implementations 
{ 
    [CustomRole("Admin")] 
    public void Method() { ... } 
} 

class ServiceChecker : IService // one of many implementations 
{ 
    IService m_svc; 
    public ServiceChecker(IService wrapped) { m_svc = wrapped; } 

    public void Method() 
    { 
     var mi = m_svc.GetType().GetMethod("Method"); 
     if(mi.IsDefined(typeof(CustomRoleAttribute), true) 
     { 
      CustomRoleAttribute attr = (CustomRoleAttribute)mi.GetCustomAttributes(typeof(CustomRoleAttribute), true)[0]; 
      if(!attr.Role.Equals(GetCurrentUserRole()) // depends on where you get user data from 
      { 
       throw new SecurityException("Access denied"); 
      } 
     } 
     m_svc.Method(); 
    } 
} 

// the client code 
IService svc = new ServiceChecker(new ServiceImpl()); 
svc.Method(); 
0

您的代碼看起來有點不對。 這裏是我的類有CustomRoleAttribute

public class MyClass 
{ 
     [CustomRole("Admin")] 
     public void MyMethod() 
     { 


     } 
} 

您屬性應該定義AttributeUsage,以確保其他開發方法不使用您的屬性上的屬性或構造函數:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false,Inherited = true)] 
public class CustomRoleAttribute : Attribute 
{ 
     public string Role { get; private set; } 

     public CustomRoleAttribute(string role) 
     { 
      Role = role; 
     } 
} 

現在把兩者一起:

MyClass myClass = new MyClass(); 
MethodInfo[] methods = myClass.GetType().GetMethods(); // Access all the public methods. 

     foreach (var methodInfo in methods) // iterate trough all methods. 
     { 

      // Get all custom attributes from the method. 
      object[] attributes = methodInfo.GetCustomAttributes(typeof (CustomRoleAttribute), true); 

      if (attributes.Length > 0) 
      { 
       CustomRoleAttribute attribute = (CustomRoleAttribute)attributes[0]; 
       if (attribute.Role == "Admin") 
       { 
        // the role is admin 
       } 
      } 
     } 

您現在看到如何使用屬性。你必須首先檢查屬性並訪問該方法。