在属性中传递动态参数(PostSharp)

本文关键字:参数 PostSharp 动态 属性 | 更新日期: 2023-09-27 18:24:42

我正在尝试实现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方面调用方法来访问数据库。但是,我不能从方面访问这些方法,因为引用方面所在的类库会导致循环依赖。(我使用的是三层架构)

在属性中传递动态参数(PostSharp)

使用不编译时间常数作为属性参数没有什么好方法。

您可以考虑使用包含抽象(接口或基本抽象类或实现的静态包装器)的第三个dll来攻击循环依赖性的另一个问题,并在两个程序集中引用它,并在方面中使用该抽象的实现。

我解决这个问题的另一种方法是将对方法的调用封装在派生属性类的构造函数中:

class DerivedAuthorisationAspect:AuthorisationAspect
{
   public DerivedAuthorisationAspect():base(sth.GetRoles(), sth.GetUserRoles()){}
}

如果您能计算出sth.,这将起作用。注意,属性实例是特殊类型的类,因此每个类可以多次调用您的方法。

即使要做更多的工作,我也会建议第一个——它更干净。