【问题标题】:AOP programming in PostSharp to suppress existing codePostSharp 中的 AOP 编程以抑制现有代码
【发布时间】:2013-09-18 01:53:17
【问题描述】:

我正在尝试借助 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 中是否可行?这里的核心点是将现有应用程序更改为方面所需的最小更改。

【问题讨论】:

    标签: aop postsharp


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-10
      • 1970-01-01
      相关资源
      最近更新 更多