PostSharp中的AOP编程可以抑制现有代码

时间:2013-09-17 11:11:06

标签: aop postsharp

我试图在postsharp

的帮助下在现有应用程序中实现AOP

现有应用程序中的方法将在进入和退出时进行特定调用

class Test
{
Method1()
{
Log.Start()
//code
Log.Stop()
}

Method2
{
Log.Start()
//code
Log.Stop()
}
}

现在,如果我声明了一个方面,那就说LogAspect包含

  public override void OnEntry(MethodExecutionArgs args) 
    {
       Log.Start();
     }
     public override void OnExit(MethodExecutionArgs args) 
    {
       Log.Stop();
     }

现在我想将此方面用于测试类

所以我这样做。

[LogAspect()]
class Test
{
method1()
{
}

method2()
{
}
}

现在,LogAspect将应用于所有测试方法。

但Log.Start(),Log.Stop()已存在于method1和method2中,因此它们会被执行两次。是否有任何方法LogAspect可以抑制method1和method2中的Log.Start()和Log.Stop()并在进入和退出时单独执行其自己的功能。如果没有任何其他解决方案,这是否可以在Postsharp中使用,因为我是AOP的新手?这里的核心要点是将现有应用程序更改为方面所需的最小更改。

1 个答案:

答案 0 :(得分:1)

目前,PostSharp本身无法修改您的代码,无法删除对现有Log.Start()Log.Stop()方法的调用。

我可能会建议一个简单的解决方案来应用重构和修改现有的日志记录方法,这样它们就不再执行日志记录(可能基于条件)。在您的方面内部调用其他新的日志记录方法,这将执行实际的日志记录。

public override void OnEntry(MethodExecutionArgs args) 
{
    Log.NewStart();
}

public override void OnExit(MethodExecutionArgs args) 
{
    Log.NewStop();
}

如果您需要更高级的解决方案,那么在旧的日志记录方法中,您可以检查LogAspect是否已应用于当前方法,并仅在此情况下跳过日志记录。但这将很难实现,并且可能无法满足您添加AOP所需的最小努力。