【发布时间】:2013-07-23 12:34:58
【问题描述】:
我正在尝试实现 PostSharp 属性来检查访问某个方法的用户是否被授权这样做。我已经实现了一个测试解决方案,但硬编码值如下:
[AuthorisationAspect(RolesEnum.Roles.Admin, RolesEnum.Roles.User]
第一个参数描述用户应该拥有的角色,第二个参数描述当前用户的角色。就像我提到的,这只是一个测试。我现在要实现的是相同的概念,但有一些不同。这两个参数现在都是列表,因为一个方法可以由多个角色访问,并且单个用户也可以具有多个角色。因此,我想要实现的是使用 PostSharp 比较这两个列表。我尝试了几种不同的方法来解决它,但我总是遇到同样的错误:
"属性参数必须是常量表达式,typeof 属性参数的表达式或数组创建表达式 类型。”
我尝试过的解决方案:
首先我尝试了类似以下的方法,但就像错误描述的那样,我无法在属性中调用方法。
[AuthorisationAspect(GetRoles(), GetUserRoles()]
但后来我意识到这是不可能的,因为只有静态/常量值可以作为属性中的参数传递。
我也尝试过使用基于此解决方案的东西。 How to set dynamic value in my Attribute 但它甚至没有编译。
最后,我还查看了以下解决方案 http://geekswithblogs.net/abhijeetp/archive/2009/01/10/dynamic-attributes-in-c.aspx,但是当我尝试使用 AOP 时它看起来太复杂了,这应该会使事情变得更简单。
基本上,我试图在属性中传递动态参数并传递给 PostSharp 属性,但我无法实现。我不知道这是否可能,也许有更好的方法来解决这个问题。任何帮助将不胜感激。
注意:最简单的解决方案是直接从 PostSharp 方面调用方法来访问数据库。但是,我不能从切面访问这些方法,因为引用切面所在的类库会导致循环依赖。 (我使用的是 3 层架构)
【问题讨论】:
标签: c# attributes aop postsharp