.net 接口方法的Postsharp编译时验证

.net 接口方法的Postsharp编译时验证,.net,aop,postsharp,.net,Aop,Postsharp,我有一个包含服务契约的程序集(程序集名称为contracts)。我想使用属性和PostSharp对这些方法实现授权。 授权属性如下所示: public class Auth : System.Attribute { public Auth(String permission){...} } namespace Contracts { public interface IService { [Auth("CanCallFoo")] voi

我有一个包含服务契约的程序集(程序集名称为
contracts
)。我想使用属性和PostSharp对这些方法实现授权。 授权属性如下所示:

public class Auth : System.Attribute 
{
    public Auth(String permission){...}
}
namespace Contracts
{
    public interface IService
    {
        [Auth("CanCallFoo")]
        void Foo();
    }
}
我希望我的服务合同如下所示:

public class Auth : System.Attribute 
{
    public Auth(String permission){...}
}
namespace Contracts
{
    public interface IService
    {
        [Auth("CanCallFoo")]
        void Foo();
    }
}

我想在编译时检查
Contracts
程序集中接口的所有方法是否具有
Auth
属性。
为此,我创建了以下方面:

[Serializable]
[MulticastAttributeUsage(MulticastTargets.Interface & MulticastTargets.Method)]
public class EnforceSecurityAspect : OnMethodBoundaryAspect
{
    public override bool CompileTimeValidate(System.Reflection.MethodBase method)
    {
        var hasSecurityAttribute = method.GetCustomAttributes(true).Any(x => x is Auth);
        if (!hasSecurityAttribute)
        {
            throw new InvalidAnnotationException(String.Format("Add `Auth` to `{0}`", method.Name));
        }

        return base.CompileTimeValidate(method);
    }
}
我在
合同的AssemblyInfo中使用这行代码应用方面
程序集:

[assembly: EnforceSecurityAspect()]
在同一程序集中,我还有DTO,这些DTO由服务使用。
我面临的问题是,方面也应用于DTO
例如,我有这样一个DTO
public class Client
{
    public String Name{get;set;}
}
在编译时,我得到一个错误,说我应该将
Auth
添加到编译器生成的
get\u Name
方法中。

问:有没有办法告诉Postsharp方面应该只应用于接口的方法

我知道这是一个老问题,但我也想向任何有此问题的人提供答案

虽然可以使用特定的目标来继承/实现postsharp的特定接口/类,但我不知道如何实现

解决这个问题的方法是创建一个方面并以类为目标(还没有,但我确信这是可能的)。然后,您可以使用反射仅验证从某个类/接口继承的类,方法可以是

使用与下面代码类似的东西。(请注意,这是postsharp企业价格功能)


我知道这是一个老生常谈的问题,但我也想为任何有这个问题的人提供一个答案

虽然可以使用特定的目标来继承/实现postsharp的特定接口/类,但我不知道如何实现

解决这个问题的方法是创建一个方面并以类为目标(还没有,但我确信这是可能的)。然后,您可以使用反射仅验证从某个类/接口继承的类,方法可以是

使用与下面代码类似的东西。(请注意,这是postsharp企业价格功能)