我有一个使用AOP和ContextBoundObject的系统.
这用于拦截方法调用并在函数之前和之后执行某些操作.一切正常,直到我将'截获的功能'异步.
据我所知,C#编译器将异步方法重写为状态机,一旦达到'await',它就会将控制权返回到接收器.因此它继续进入拦截并执行仅在Method之后执行的代码.
我可以看到IMessageSink中有一个"AsyncProcessMessage",但我找不到调用它的方法,我不确定它是否可以在async/await场景中工作.
有没有办法让Async/Await与ContextBoundObject一起工作?使用另一种面向方面编程方法是唯一的选择吗?
下面的代码示例包含用"Audit"属性修饰的方法,并放在AuditFacade中,这是一个ContextBoundObject.AuditSink中的SyncProcessMessage方法具有在方法之前和之后执行的逻辑.
[AuditBoundary]
public class AuditFacade : ContextBoundObject
{
[Audit]
public ResponseObject DoSomthing()
{
//Do something
return new ResponseObject();
}
/// <summary>
/// Async Method to be intercepted
/// </summary>
/// <returns></returns>
[Audit]
public async Task<ResponseObject> DoSomthingAysnc()
{
//Do something Async
await Task.Delay(10000);
return new ResponseObject();
}
}
[AttributeUsage(AttributeTargets.Method)]
public class AuditAttribute : Attribute
{
}
[AttributeUsage(AttributeTargets.Class)]
public class AuditBoundaryAttribute : ContextAttribute
{
public AuditBoundaryAttribute()
: base("AuditBoundary" + Guid.NewGuid().ToString())
{
}
public override void GetPropertiesForNewContext(IConstructionCallMessage ctorMsg) …Run Code Online (Sandbox Code Playgroud)