.net – 日志记录,面向方面的编程和依赖注入 – 试图理解这一切

前端之家收集整理的这篇文章主要介绍了.net – 日志记录,面向方面的编程和依赖注入 – 试图理解这一切前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我知道日志记录是AOP的主要用例。另外,日志包装器也被示例为当你想使用DI,使类不与特定的日志实现耦合的情况。然而, some consider logging wrappers an anti-pattern.首先,这样的视图是因为在大多数情况下,包装器往往是简单的,并删除了许多特定的日志框架的功能。如果你实现那些特定的功能,为什么不直接使用框架。

我知道Common.Logging的立面,试图抽象出大量的功能log4Net,EntLib,NLog为你。然而,即使在这里,我们仍然有一个依赖于Common.Logging。不是在代码/单元测试方式关于接口等,但如果项目死亡(从上一版本已经过去一年),或者你想后面切换到不支持的日志记录器,这可能会导致问题。

也就是说,如果通过AOP实现日志记录,甚至有必要使用DI来记录日志依赖性(即为什么不直接引用NLog)?是的,代码的AOP部分将紧密耦合,但是想要单元测试的类的逻辑没有日志依赖性(至少在编织发生之前)。在这一点上,我有点失落(我还没有尝试过AOP)。编织后,没有使用DI的AOP代码导致测试方法的单元测试的问题?还是可以一个单元测试而不编织AOP代码

除非日志记录是软件用户的要求,我不知道测试日志记录是否与mock一起有用。我认为被测方法的业务逻辑是大多数人对测试感兴趣的。最后,如果想使用TDD / BDD,不需要在AOP代码中使用DI来记录依赖关系?或者一个只是不测试驱动AOP的东西?

正如你所看到的,我试图得到一个感觉,开发一个应用程序,最有用的方法是使用AOP交叉关注和DI设计/测试。由于AOP是比较新的,日志记录是最常见的例子,推荐的方法是什么?

日志不是一个服务,它是一个 cross-cutting concern.因此,它最好实现与 Decorator.但是,添加大量装饰只是为了启用各种不同的服务日志记录往往违反 DRY,在这种情况下,你可以进一步发展这些装饰器单个拦截器。

虽然你可以使用IL编织实现AOP,一个更好的选择是使用支持动态拦截的DI容器,因为它是一个更轻量级的解决方案。

这使您能够将具体服务与日志记录完全解耦。在这种情况下,我会说,没有理由包装任何特定的日志框架,因为如果你想改变日志框架,你可以只改变那个单一的拦截器。

Here’s an example谈论装饰和拦截器的仪器(非常类似于日志)。

如果你想了解更多关于AOP和DI,你可以view online this talk I gave at GOTO Copenhagen 2010

猜你在找的设计模式相关文章