我记得 log4net 与 NH 一起出现并且对于 OR-Mapper 是强制性的那些日子(真的是不久前)。现在它不再是强制性的,而是可选的。
我真的很想知道 NHibernate 是如何实现这一点的。如果有人能用几句话解释,那将不胜感激!
我记得 log4net 与 NH 一起出现并且对于 OR-Mapper 是强制性的那些日子(真的是不久前)。现在它不再是强制性的,而是可选的。
我真的很想知道 NHibernate 是如何实现这一点的。如果有人能用几句话解释,那将不胜感激!
NHibernate 有一个 ILoggerFactory 来创建如下定义的记录器:
public interface ILoggerFactory
{
IInternalLogger LoggerFor(string keyName);
IInternalLogger LoggerFor(System.Type type);
}
该IInternalLogger
接口,尽管名称根本不是内部的,但却是实际的记录器接口,毫不奇怪,它准确地映射ILog
了log4net
. NH 在需要记录时在内部询问记录器工厂。如果没有配置其他记录器,并且存在 log4net 程序集,则工厂返回 log4net 的包装器。如果您想提供自己的,您只需要提供一个记录器工厂并将其配置为:
<appSettings>
<add key="nhibernate-logger"
value="MyLoggingLoggerFactory, MyLoggingAssembly"/>
</appSettings>
如您所料,MyLoggingLoggerFactory 类必须实现ILoggerFactory
。返回的记录器当然必须实现IInternalLogger
,如前所述,即使不愉快的名称可能会产生误导,它也是公开的。这是他们用来log4net
独立的策略。另外,如果您根本不需要日志,只需从部署目录中删除 log4net 程序集:NH 将正常降级并在内部使用空记录器。
NHibernate 不再引用 log4net.dll。它确实有自己的记录器抽象层,但是,它们确实有一个为 log4net 设计的自己的记录器抽象的内置实现。
他们通过强制 CLR 使用反射加载 log4net 程序集来实现这一点,当然,当您将 NHibernate 配置为使用 log4net 时。如果您对更多内容感兴趣,请参阅使用您最喜欢的反射器的 NHibernate.Log4NetLogger 和 NHibernate.Log4NetLoggerFactory。