我尝试实现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层架构)
答案 0 :(得分:1)
没有好的方法可以使用不编译时间常量作为属性参数。
您可以考虑使用包含抽象(接口或基本抽象类或您的实现的静态包装器)的第三个dll来解决循环依赖的其他问题,并在两个程序集中引用它并在您中使用该抽象的实现方面。
我解决这个问题的另一种方法是在派生属性类的构造函数中包含对方法的调用:
class DerivedAuthorisationAspect:AuthorisationAspect
{
public DerivedAuthorisationAspect():base(sth.GetRoles(), sth.GetUserRoles()){}
}
如果您能够找出属性实例是特殊种类的sth.
注释,这将有效,因此每个类可以多次调用您的方法。
我会建议第一个,即使它还有更多工作要做 - 它更清洁。