日志logging,面向方面的编程和dependency injection – 试图理解这一切
我知道日志logging是AOP的主要用例。 此外,还要logging日志包装器,以便您可以使用DI,以便类不会与特定的日志logging实现结合使用。 但是, 有些人认为logging包装是一种反模式 。 首先,这样的观点是因为在大多数情况下,包装往往是简单的,并删除了日志框架的许多特定的function。 如果你实现这些特定的function,为什么不直接使用框架。
我意识到Common.Logging外观试图为您抽象log4Net,EntLib,NLog的大量function。 但是,即使在这里,我们仍然对Common.Logging有各种依赖。 不是在接口等代码/unit testing方式,但如果项目死亡(自上个版本已经超过一年),或者你希望后者切换到不支持的logging器,可能会导致问题。
也就是说, 如果通过AOP来实现日志logging,甚至有必要使用DI作为日志依赖 (也就是说为什么不直接引用NLog)? 是的,代码的AOP部分将被紧密耦合,但是人们想要unit testing的类的逻辑没有日志依赖性(至less在编织发生之前)。 在这一点上,我有点失落(我还没有尝试过AOP)。 编织之后,会不会有AOP代码使用DI导致unit testing方法出现问题? 或者可以一个unit testing而不编织AOP代码?
除非日志logging是软件用户的要求,否则我不确定testing日志logging是否发生在mock中是多么有用。 我认为被测方法的业务逻辑是大多数人对testing感兴趣的。 最后,如果想要使用TDD / BDD,那么在AOP代码中不需要使用DI进行日志logging依赖关系吗? 或者只是不试驾 AOP的一面呢?
正如你所看到的,我试图去感受一下开发一个应用程序的最实际的方法是什么,这个应用程序可以同时使用AOP和横向关注以及DI进行devise/testing。 由于AOP是相对较新的,日志logging是最常见的例子,所推荐的方法是什么?
logging不是一个服务,这是一个交叉的关注 。 因此,最好使用装饰器来实现。 但是,为了启用各种不同服务的日志logging,添加大量装饰器往往会违反DRY ,在这种情况下,您可以将这些装饰器进一步发展为单个拦截器。
虽然可以使用IL编织来实现AOP,但更好的select是使用支持dynamic拦截的DI容器,因为它是一个更轻量级的解决scheme。
这使您可以将具体服务与日志logging完全分离。 在那种情况下,我会说没有理由来封装任何特定的日志框架,因为如果你想改变日志框架,你可以改变那个单一的拦截器。
下面是一个关于装置和拦截器的例子 (与日志非常相似)。
如果您想了解更多关于AOP和DI的信息,可以在线查看我在2010年哥本哈根GOTO上的演讲 。