0

我正在尝试在 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 有什么方法可以抑制方法 1 和方法 2 中的 Log.Start() 和 Log.Stop() 并在进入和退出时单独执行自己的功能。如果不是任何其他解决方案,因为我是 AOP 的新手,这在 Postsharp 中是否可行?这里的核心点是将现有应用程序更改为方面所需的最小更改。

4

1 回答 1

1

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

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

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

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

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

于 2013-09-17T17:31:06.873 回答