我正在使用Castle Windsor伐木设施,它运作良好。我有一个安装程序,它注册一个拦截器和一个工具来连接事件,以便我可以保持大部分代码幸福地不知道Castle和log4net。
我的大多数注册都发生在代码中,但对于日志记录,我在web.config(首先安装)中挂起它,如下所示:
<castle>
<facilities>
<facility id="logging"
type="Castle.Facilities.Logging.LoggingFacility, Castle.Facilities.Logging" loggingApi="log4net" />
</facilities>
<installers>
<install type="MyProject.LoggerInstaller,MyProject" />
</installers>
</castle>
原因是我去制作时不必包含此配置部分。这也意味着我可以很容易地从log4net切换到nlog到我们可能想要的其他任何东西。并且意味着我的组件都不必直接引用log4net。
我遇到的问题是我想在注册阶段使用一些日志记录。我这样做是因为注册有点复杂,我希望能够轻松地关注正在发生的事情以及需要多长时间。 (主要是因为我有一个插件类型系统。)
在我的LoggerInstaller中,我试图解决ILoggerFactory,以便我可以创建一个记录器并在我的实用程序对象中为它挂钩一些事件。但这失败了:
ComponentNotFoundException: No component for supporting the service Castle.Core.Logging.ILoggerFactory was found
从挖掘Castle源码开始,我认为所有安装程序都安装在任何设施之前,因此看起来该设施尚未在我的安装程序中初始化。如果我创建第二个安装程序只是为了连接事件,以便它不会通过XML配置发生,那么它可以正常工作,但我希望所有日志相关在一起 - 如果日志记录不是连接事件没有意义不可用。 (而且我必须弄清楚是否启用了日志记录.. ??)
理想情况下,我想从我的安装程序注册Castle Logging工具,但我不知道如何包装其可配置元素。 (或者我是否愿意。)
有更简单的方法吗?我怀疑我没有做一些通常是个好主意的事情,因为我知道我不应该在注册阶段真正解决。但我认为安装很复杂,需要一点点记录。
之前还有其他人做过这种事吗?任何帮助(或转向更正义的道路!)都将非常感激。
答案 0 :(得分:1)
如果问题确实只是在安装程序完成后才会注册记录器工厂,您可以尝试以下操作:
制作2个配置部分castle1 castle2。
<castle1>
<facilities>
<facility id="logging"
type="Castle.Facilities.Logging.LoggingFacility, Castle.Facilities.Logging" loggingApi="log4net" />
</facilities>
</castle1>
<castle2>
<installers>
<install type="MyProject.LoggerInstaller,MyProject" />
</installers>
</castle2>
并分两步初始化容器:
container.Install(new ConfigurationInstaller(new XmlInterpreter(new ConfigResource("castle1"))));
container.Install(new ConfigurationInstaller(new XmlInterpreter(new ConfigResource("castle2"))));
同样在配置文件的顶部,您必须指定castle1和castle2部分。
我没试过,但我觉得值得一试。
亲切的问候, Marwijn