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