请注意,本站并不支持低于IE8的浏览器,为了获得最佳效果,请下载最新的浏览器,推荐下载 Chrome浏览器
欢迎光临。交流群:166852192

Orchard源码分析(4.2):Orchard.Logging.LoggingModule类




与CollectionOrderModule一样,LoggingModule也是一个Autofac模块。它以属性注入的方式给需要日志服务的对象设置Logger。

如果一个类有ILogger型的公共可写实例属性(忽略索引),Autofac容器在解析(Resolve)该类的时候,将注入一个ILogging实现类的实例。Orchard默认会注入一个CastleLogger对象。当然Orchard也允许一个类中有多个ILogger型属性,也支持将CastleLogger替换成其他Logger。


如有必要,请先了解一下简单工厂模式、抽象工厂模式和适配器模式(对象适配器模式)。CastleLoggerFactory工厂负责创建CastleLogger对象,而CastleLoggerFactory适配了OrchardLog4netFactory;CastleLogger实际上适配的是OrchardLog4netLogger;OrchardLog4netLogger又适配了log4net.Core.ILogger——也就是说CastleLogger是log4net.Core.ILogger经过层层包装的结果
如果有类TestContrller,其有一个ILogger属性,注入流程如下:
1、Autofac容器创建TestController类的实例instance;
2、检查instance是否有一个ILogger型的公共可写实例属性。如果有(有可能还不只一个)则进入步骤3,否则以下步骤不没必要进行了;
3、从缓存中获取TestController类型对应的Logger,如果获取成功进入步骤6;
4、从Autofac容器获取ILogger:

从容器中获取CastleLoggerFactory
->CastleLoggerFactory创建ILogger对象
->交由OrchardLog4netFactory创建OrchardLog4netLogger
->交由log4net.LogManager.GetLogger创建一个log4net.Core.ILogger对象
->log4net.Core.ILogger对象适配成OrchardLog4netLogger对象
->OrchardLog4netLogger适配成CastleLogger对象
->CastleLoggerFactory最终返回一个CastleLogger对象
5、缓存Logger
6、
将Logger注入对应的属性。
相关类型:
Orchard.Logging.CastleLogger : Orchard.Logging.ILogger
Orchard.Logging.CastleLoggerFactory : Orchard.Logging.ILoggerFactorya
Orchard.Logging.OrchardLog4netFactory : Castle.Core.Logging.ILoggerFactory
Orchard.Logging.OrchardLog4netLogger
Castle.Core.Logging.AbstractLoggerFactory

参考资料:
Autofac:Structuring With Modules
Autofac:Activation events

Autofac:属性注入

Autofac.Module
Log4net
Castle Logging
简单工厂模式
抽象工厂模式
适配器模式
How Orchard CMS does the logging



作者原创内容不容易,如果觉得内容不错,请点击右侧“打赏”,赏俩给作者花花,也算是对作者付出的肯定,也可以鼓励作者原创更多更好内容。
更多详情欢迎到QQ群 166852192 交流。