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

问题描述 投票:1回答:1

例如,我有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

但是,如果我想同时使用两种方式呢?因为我想记录方法调用本身(不是迭代启动)。

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

postsharp
1个回答
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" );
    }
}

附:当前版本的PostSharp将为上面的示例发出构建时警告。这是由于应该在即将发布的版本中修复的错误。方面的运行时行为不受影响。

© www.soinside.com 2019 - 2024. All rights reserved.