1.LogManager -- facade 用于与系统外部交互。
1.1 GetLogger 获取命名日志对象
-
- 获取assamble,也可以通过repository。
- 调用loggerManager
- 对得到 Ilogger 对象进行包装。
- ?为什么不在loggerManager中进行包装呢?这里的包装器,又不能进行配置
- LoggerManager是内部Logger的管理者,Logger并不适合直接把用于外部系统。
- warpper 模式可以动态的为对象附加新的职责,但是如果不能配置岂不是有点囧?
- ILoggerWarpper并不是包装模式!
- ?为什么不在loggerManager中进行包装呢?这里的包装器,又不能进行配置
LogManager获得的是ILog 对象
LoggerManager 获得的是ILogger对象
当获得到ILogger对象后使用WrapperMap 对象去lookup ILog
2.WrapperMap
Maps between logger objects and wrapper objects.
?这里是不是Warpper模式,还是一个Factory
构造函数使用了一个 WrapperCreationHandler 用于创建wrapper
m_repositories维护了 当前所有Logger实例和Wapper实例的对应关系。
-
- m_repositories是一个Hashtable,包含了Logger.Repository <—>Hashtable (包含当前Logger 和 wrapper)的对应关系。
- 这么设计的好处?
- 目前认为是可以在一个统一的地方记录下所有logger实例和wrapper的对应关系,由于对应关系是多对多,所以这个记录结构也就是现在这样的了。
- Repository到底是什么用呢?难道只是访问关系的秘要吗?
- 也许是这样,如果单纯的使用Key话,就不能实现那种继承关系了,现在这样使用这个类的话,那么就可以实现类似
- loggerA 拥有 RepositoryA级别的对应关系,RepositoryB :RepositoryA ,那么LoggerB,拥有LoggerA的关系,及自己的关系。?
- 但是关系是包含Logger的实例的,这样的关系如何处理呢?
- 看来另一种考虑也许更好,Repositories表示的是ILogger所属的库,所以这里维护的是,库s--》某个库---》logger----对应---warpper
!由于WrapperMap是总负责所有Logger,Wrapper的对应关系的,所有这种设计可以很好的管理所有的logger,为每一个logger注册了一个LoggerRepositoryShutdownEventHandler
处理程序,在Logger.Repository.ShutdownEvent 事件触发时,可以自动维护好关系。
3.WrapperCreationHandler
WrapperCreationHandler 是一个delegate , 声明方式如下
public delegate ILoggerWrapper WrapperCreationHandler(ILogger logger);
这里实现了一个策略模式用于封装Map过程。
4.LoggerRepositoryShutdownEventHandler。
private readonly LoggerRepositoryShutdownEventHandler m_shutdownHandler;
5.ILog,ILoggerWrapper,ILogger
ILogger是系统内部元素
ILog 是面向外部系统使用的元素,所以组合了ILogger,实现了更友好的处理方式。
ILoggerWrapper 是对ILogger的包装,ILog:ILoggerWrapper
这部分需要具体查看一个日志记录器的实现。
6.LoggerManager
6.1 使用 RepositorySelector 获取Ilogger实例
loggerManager中维护了一个 RepositorySelector ,用来获取Ilogger
7.IRepositorySelector
Interface used by the <see cref="LogManager"/> to select,create the <see cref="ILoggerRepository"/>.
每一个实现了IRepositorySelector 的class
-
- 必须维护一个 Assamble to ILoggerRepository 的Hashtable
- 必须维护一个 repositoryName to ILoggerRepository 的Hashtable
具体Selector 的生成 需要读取 Assamble有关。
用于获取ILoggerRepository 的实例。
8.ILoggerRepository
This interface is used by the <see cref="LogManager"/> to obtain <see cref="ILog"/> interfaces.
维护着Loger,Level,app