2011-05-17 59 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

相关问题