PostSharp:如何混合语义和非语义建议?
PostSharp: How to mix semantic and non-semantic advising?
例如,我有 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
被调用 before/after 创建 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" );
}
}
P.S。当前版本的 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
被调用 before/after 创建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" );
}
}
P.S。当前版本的 PostSharp 将针对上述示例发出构建时警告。这是由于应该在即将发布的版本之一中修复的错误。方面的 运行 时间行为不受影响。