2011-05-17 60 views
2

我有一個基於MVVM鬆散的Winforms項目。安全性是由域層實現使用下的PrincipalPermissionAttribute,像這樣:你可以在運行時評估一個方法的屬性嗎?

Public Class Order 

    <PrincipalPermissionAttribute(SecurityAction.Demand, Role:="Managers")> _ 
    Public Sub ChangeBillingAddress(NewAddress as Address) 

     Me.BillingAddress = NewAddress 

    End Sub 


End Class 

我想爲我的ViewModel要能夠指導上,其基於下的PrincipalPermissionAttribute域中啓用/禁用的觀點:

Public Class OrderViewModel 

    Private _Order as Order 
    Public Sub New(Order as Order) 
     _Order = Order 
    End Sub 

    Public Readonly Property ChangeBillingAddressEnabled as Boolean 
     Get 
      'Here I want to take Thread.CurrentPrincipal and evaluate 
      'it's Role against the PrincipalPermissionAttribute on 
      '_Order.ChangeBillingAddress. If the user will succeed 
      'in changing the billing address return True, else return False. 
     End Get 

    End Property 
End Class 

是有辦法的視圖模型來評估下的PrincipalPermissionAttribute並確定當前Thread.Principal會成功嗎?

回答

1

是的,你絕對可以找回方法的屬性,並與他們做東西。

例如(在C#不好意思):

return _Order.GetType() 
      .GetMethod("ChangeBillingAddress") 
      .GetCustomAttributes(typeof(PrincipalPermissionAttribute), true) 
      .Cast<PrincipalPermissionAttribute>() 
      .All(r => IsPermittedAccess(r, Thread.CurrentPrincipal)); 

在這裏你可以制定出如何處理屬性做:

bool IsPermittedAccess(PrincipalPermissionAttribute rule, IPrincipal user) 
{ 
    // return ? 
    throw new NotImplementedException(); 
} 

我將離開決定是否該用戶的最後一個任務是否符合屬性的要求。我對框架的這一部分不夠熟悉。您也可以處理錯誤處理(例如方法不存在該名稱)。

我還會補充一點,你可能想緩存(在一個靜態字段中?)方法反射的結果,因爲它永遠不會改變。您還需要確保您的視圖模型在主體更改或主體角色集合發生更改時(即如果更改時)觸發了屬性更改通知。

+0

偉大的解決方案。相對而言,你覺得這種反射電話有多貴? – 2011-05-17 23:58:29

+0

我不太確定 - 我只是知道,如果可以的話,常見建議是始終緩存反射數據。我想這取決於你打算多久打一次電話......但是,我認爲你會將你的UI綁定到這個「_Action_Enabled」值,這意味着它可能會被調用的方式超出你的預期,所以你可能會以及緩存它(一個靜態的懶加載屬性應該足夠了)。 – Reddog 2011-05-18 18:10:45

相關問題