我知道Common.Logging的立面,试图抽象出大量的功能log4Net,EntLib,NLog为你。然而,即使在这里,我们仍然有一个依赖于Common.Logging。不是在代码/单元测试方式关于接口等,但如果项目死亡(从上一版本已经过去一年),或者你想后面切换到不支持的日志记录器,这可能会导致问题。
也就是说,如果通过AOP实现日志记录,甚至有必要使用DI来记录日志依赖性(即为什么不直接引用NLog)?是的,代码的AOP部分将紧密耦合,但是想要单元测试的类的逻辑没有日志依赖性(至少在编织发生之前)。在这一点上,我有点失落(我还没有尝试过AOP)。编织后,没有使用DI的AOP代码导致测试方法的单元测试的问题?还是可以一个单元测试而不编织AOP代码?
除非日志记录是软件用户的要求,我不知道测试日志记录是否与mock一起有用。我认为被测方法的业务逻辑是大多数人对测试感兴趣的。最后,如果想使用TDD / BDD,不需要在AOP代码中使用DI来记录依赖关系?或者一个只是不测试驱动AOP的东西?
正如你所看到的,我试图得到一个感觉,开发一个应用程序,最有用的方法是使用AOP交叉关注和DI设计/测试。由于AOP是比较新的,日志记录是最常见的例子,推荐的方法是什么?
虽然你可以使用IL编织实现AOP,一个更好的选择是使用支持动态拦截的DI容器,因为它是一个更轻量级的解决方案。
这使您能够将具体服务与日志记录完全解耦。在这种情况下,我会说,没有理由包装任何特定的日志框架,因为如果你想改变日志框架,你可以只改变那个单一的拦截器。
Here’s an example谈论装饰和拦截器的仪器(非常类似于日志)。
如果你想了解更多关于AOP和DI,你可以view online this talk I gave at GOTO Copenhagen 2010。