0

我正在使用 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 工具,但我不知道如何包装它的可配置元素。(或者我是否愿意。)

有没有更简单的方法?我怀疑我没有做通常是个好主意的事情,因为我知道我不应该在注册阶段真正解决。但我认为安装足够复杂,需要一点日志记录。

以前有没有其他人做过这种事情?任何帮助(或转向更正直的道路!)将不胜感激。

4

1 回答 1

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

于 2013-05-17T15:13:19.453 回答