我一直在研究使用 Castle Windsor 将 Log4Net ILog 注入类的方法。在大多数示例中,我看到 Castle Windsor 可以在哪里提供提供属性注入的“促进者”,并注入 ILogger(而不是 ILog)。我只找到了一个使用构造函数注入的示例,并且没有使用辅助方法(请参阅Castle Windsor 依赖注入:使用调用者类型作为参数)
在所有这些示例中,Log4Net 似乎都想要一个命名记录器。大多数示例参考 Log4Net 静态方法 LogManager.GetLogger(此处为类名)。这使得在不使用反射或辅助方法的情况下定义 CastleWindsor 的依赖关系成为一项挑战(可以将辅助方法与 ctor 注入一起使用吗???)。在查看 Ilya Kogan 提出的问题(上面的 URL ...)时,我想我不明白我为什么需要,甚至想要一个命名的记录器。我不能到处使用同名的记录器吗?
例如,我不能只注册硬编码名称为 XXX 的记录器吗?(它似乎工作正常,最后,我只想记录 - 我不在乎哪个记录器记录了它......)是否存在范围问题?是否存在内存泄漏问题?为什么记录器不能/不应该是单例?
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(
Component.For<log4net.ILog>().UsingFactoryMethod(() => log4net.LogManager.GetLogger("xxx"))
);
}
更新:
经过一些研究,可以使用硬编码的命名记录器 - 例如上面我的示例中的 XXX,但是如果记录器的配置将记录器名称输出到日志文件并且记录器名称被动态分配给与方法相同的名称或类,您会自动获得对日志记录来源的引用。日志文件中的上下文非常有帮助。
在专门解决 ctor 注入时,似乎有 5 种可能的选择......
- 使用单例而不使用命名记录器(因此不在日志文件中报告)
- 将反射与 ctor 注入一起使用(如 Ilya Kogan 的示例所示)
- 使用属性注入(通过促进者)
- 使用 post-sharp AOP IL 注入进行日志记录
- 使用 CTOR 注入(通过促进者)