例如,我有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
。但是,如果我想同时使用两种方式呢?因为我想记录方法调用本身(不是迭代启动)。
也许我可以通过低级别的建议实现这一目标?
是的,您可以通过在同一方面创建两组建议来实现此目的,如下例所示。
[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将为上面的示例发出构建时警告。这是由于应该在即将发布的版本中修复的错误。方面的运行时行为不受影响。