PostSharp: Как смешать семантическое и несемантическое консультирование? - PullRequest
1 голос
/ 18 апреля 2019

Например, у меня есть 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 Ответ

1 голос
/ 26 апреля 2019

Да, вы можете достичь этого, создав две группы советов в рамках одного аспекта, как показано в примере ниже.

[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 выдаст предупреждение во время сборки для приведенного выше примера. Это связано с ошибкой, которая должна быть исправлена ​​в одном из следующих выпусков. Поведение аспекта во время выполнения не затрагивается.

...