PostSharp:如何混合语义和非语义建议?

时间:2019-04-17 22:44:30

标签: postsharp

例如,我有一个OnMethodBoundaryAspect记录器,该记录器适用于迭代器方法:

public override void OnEntry(MethodExecutionArgs args) {
    BeginMethodScope( args );
    Logger.LogRequestEntry();
}

public override void OnSuccess(MethodExecutionArgs args) {
    Logger.LogRequestSuccess();
}

public override void OnException(MethodExecutionArgs args) {
    Logger.LogRequestError( args.Exception );
}

public override void OnExit(MethodExecutionArgs args) {
    EndMethodScope( args );
}

如果我使用语义建议:

    启动OnEntry时会调用
  • IEnumerable
  • OnExit完成后调用
  • IEnumerable

如果我使用非语义建议:

    在创建OnEntry之前/之后调用
  • OnExit / IEnumerable

但是如果我想一次同时使用两种方式怎么办?因为我想记录方法调用本身(而不是迭代开始)。

也许我可以通过低级建议来实现这一目标?

1 个答案:

答案 0 :(得分:1)

是的,您可以通过在同一方面中创建两组建议来实现此目标,如下例所示。

[PSerializable]
public class MyAspect : MethodLevelAspect
{
    [OnMethodEntryAdvice(SemanticallyAdvisedMethodKinds = SemanticallyAdvisedMethodKinds.None)]
    [AdviceDependency(AspectDependencyAction.Order, AspectDependencyPosition.Before, nameof(OnEntrySemantic))]
    [SelfPointcut]
    public void OnEntry( MethodExecutionArgs args )
    {
        Console.WriteLine("OnEntry");
    }

    [OnMethodExitAdvice( Master = nameof( OnEntry ) )]
    public void OnExit( MethodExecutionArgs args )
    {
        Console.WriteLine( "OnExit" );
    }

    [OnMethodEntryAdvice]
    [SelfPointcut]
    public void OnEntrySemantic( MethodExecutionArgs args )
    {
        Console.WriteLine( "OnEntrySemantic" );
    }

    [OnMethodExitAdvice( Master = nameof( OnEntrySemantic ) )]
    public void OnExitSemantic( MethodExecutionArgs args )
    {
        Console.WriteLine( "OnExitSemantic" );
    }
}

P.S。当前版本的PostSharp将针对以上示例发出构建时警告。这是由于应在即将发布的版本中修复的一个错误。方面的运行时行为不受影响。