更好的方法来添加日志记录或需要在每个函数中发生的方法?

时间:2016-10-02 18:03:42

标签: c# asp.net design-patterns architecture

有没有更好的方法来记录或添加方法调用一系列函数而无需显式添加函数调用?

例如,我有一个类:

public class MyClass
{

public void DoStuff()
{
doSomethingEnter();

//MyCode

doSomethingExit();
}

public void DoStuff_2()
{
doSomethingEnter();

//MyCode

doSomethingExit();
}
}

doSomethingEnter()和doSomethingExit()可以记录调用其他需要在函数开始和结束时发生的事件的调用或事件。

我已阅读面向方面编程,它允许我做这样的事情:

public class MyClass
{

[DoSomethingEnterExit]
public void DoStuff()
{
   //MyCode
}
}

但是有没有一种模式或框架允许我做类似的事情,而不必购买像PostSharp这样的AOP框架?

感谢。

修改

我还研究了做一个外观,以确保总是使用具有进入和退出功能的主方法调用东西。

public class MyFacade
{
  public void MasterMethod(string methodName)
  {
    doSomethingEnter();
    if(methodName == "DoStuff")
    {
      MyClass.DoStuff();
    }
    else
    {
      MyClass.DoStuff_2();
    }
    doSomethingExit();
  }
}

2 个答案:

答案 0 :(得分:2)

使用AOP(面向方面​​编程)在编译时透明地注入代码。

PostSharp是.Net的AOP库,它使用反射属性允许您在代码中放置标记(方面),然后预编译器找到这些标记并用实际代码替换它们。

  

披露:我与PostSharp没有任何关系,但之前在我的一些项目中使用过它。

编辑:

  • 据我记忆,还有一个免费的开源版PostSharp可用于日志记录方案。

  • 我还没有听说过.Net生态系统中的其他AOP库。

答案 1 :(得分:1)

Castle Windsor提供interceptors,为您完成此任务。如果您不想仅仅为此使用整个IoC框架,您可以直接转到DynamicProxy来实现相同的目标。但是,有一个IoC容器处理接线很好而且整洁。

您还可以考虑使用Decorator模式。但是,如果问题很多,这通常会导致代码的大量增加。

使用拦截或装饰时要考虑的缺点是每个模式添加的附加问题都是透明的。这对于降低噪声非常有用,但如果支持代码的人不知道或不熟悉这些概念,则很难调试或增强。

@Bishoy在下面的评论中强调的另一个缺点是,这些是运行时解决方案,可能会影响“静态”方法所不具备的性能。