试着用markdown写些东西。貌似博客园支持的还有问题,代码片段显示错位,还得另外上传图片。还是用普通方法写写随笔好了。
Logging相对也是比较松耦合的模块,可以随时提取出来用在自己的项目中。其实说到底它还是用的log4net。先看一下几个文件。
1.ILogger。俗话说面向接口编程,这个就是Orchard中Logger的接口,提供了2个方法
public interface ILogger { bool IsEnabled(LogLevel level); void Log(LogLevel level, Exception exception, string format, params object[] args); }
2.CastleLogger
ILogger的默认实现,系统就是用的这个,看名称是CastleLogger,不要被迷惑。系统中Castle.Core.Logging.ILogger也是一个接口,log4net才是真正的实现。
3.LoggingExtensions
ILogger的一些扩展方法,如Error,Debug,Warning等,就是不同的LogLevel。
4.NullLogger
也是ILogger的实现,就是啥事不干,这样ILogger可以根据不同的上下文环境选择是否输出Log。
5.OrchardFileAppender
扩展了log4net 的 RollingFileAppender。这样当日志文件被锁定时,它可以输出到另外的文件中。
6.ILoggerFactory,CastleLoggerFactory,NullLoggerFactory
第一个是是接口,后2个是实现
7.OrchardLog4netFactory
这个Factory 继承的是AbstractLoggerFactory,这是一个真的“Factory”,CastleLoggerFactory是他的一层代理
8.LoggingModule
用于注册Logging模块
以上是大致介绍,光看名字就知道用了好几个design pattern。瞬间感觉高大上。
这样设计显而易见的是可以方便实现自己的ILoggerFactory和ILogger。另一个是在注入ILogger时候,可以把当前使用Ilogger的组件如注给它。
普通log4net实例化方法:
private static readonly ILog logger=LogManager.GetLogger(typeof(类))
这样的话就查看日志文件就可以知道日志是哪个类生成的
Orchard中的依赖注入
public class Thing { public ILogger Logger { get; set; } }
在注入的时候已经把Thing这个类关联到了这个ILogger中。而不用每次都去指定具体的类。
这种运行时动态构造对象在Orchard中使用很多。请查看LoggingModule.AttachToComponentRegistration方法。详细之后会专门介绍如何使用Autofac实现动态依赖注入。