例如,我有一个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
。但是如果我想一次同时使用两种方式怎么办?因为我想记录方法调用本身(而不是迭代开始)。
也许我可以通过低级建议来实现这一目标?
答案 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将针对以上示例发出构建时警告。这是由于应在即将发布的版本中修复的一个错误。方面的运行时行为不受影响。