【问题标题】:Passing dynamic parameters in attributes (PostSharp)在属性中传递动态参数 (PostSharp)
【发布时间】: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


    【解决方案1】:

    没有好办法使用非编译时常量作为属性参数。

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

    我解决此问题的另一种方法是将对您的方法的调用包含在派生属性类的构造函数中:

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

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

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

    【讨论】:

    • 感谢您的回复。所以最好的方法是在单独的 dll 中创建属性的接口。
    • 角色提供者的接口不是属性
    • 是的,当然,对不起,我误解了你。感谢您的建议,我会尝试更改我的实现。
    猜你喜欢
    • 1970-01-01
    • 2013-08-19
    • 2017-06-04
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    相关资源
    最近更新 更多