10

我是温莎城堡的新手,正在调查伐木设施的进出。这似乎相当令人印象深刻,但我唯一无法解决的是 Windsor 在我的类上设置 Logger 属性的位置。如以下代码所示,如​​果尚未设置类但在 Resolve 完成运行时设置了 Logger 属性,则将 Logger 设置为 nullLogger。

private ILogger logger;

public ILogger Logger
{
    get
    {
        if (logger == null) 
            logger = NullLogger.Instance;
        return logger;
    }
    set { logger = value; }
}

所以我想知道的是 Windsor 如何以及在何处设置我的 Logger 属性。

干杯安东尼

4

3 回答 3

12

记录器由配置部分中的记录工具设置<facilities>。例如,要使用 log4net,您的应用程序或 web.config 将如下所示:

<?xml version="1.0"?>
<configuration>
    <configSections>
        <section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor"/>
    </configSections>
<Configuration>

<castle>

    <facilities>
        <facility id="loggingfacility" 
             type="Castle.Facilities.Logging.LoggingFacility, Castle.Facilities.Logging" 
             loggingApi="log4net" 
             configFile="logging.config" />
    </facilities>

</castle>
</configuration>
于 2008-10-29T01:20:21.097 回答
11

您还可以在初始化 Windsor 时以编程方式进行配置(例如,从您的 global.asax.cs 中):

container.AddFacility("logging",  new LoggingFacility(LoggerImplementation.Log4net));

您当然可以选择任何记录器实现。

每当 Windsor 实例化任何期望记录器的类时,这将被连接起来。我不会把它放在构造函数中,因为它是一个横切关注点 - 最好像你在我看来建议的那样做。你可以稍微简化一下:

    private ILogger logger = NullLogger.Instance;
    public ILogger Logger
    {
        get { return logger; }
        set { logger = value; }
    }
于 2009-10-15T12:41:30.690 回答
1

由于您有一个带有 Setter 的公共属性,因此每次您从 Windsor 解析对象时,它还将尝试从容器中设置任何具有适当值的公共属性(在您的情况下,您的设施将填充到 Windsor 中的 ILogger)。

意思是,如果你从 Windsor 解决 Class,这将被设置。但如果你执行 new Class() 则不会。

至少我是这么理解的。

另一种方法是使用构造函数,这意味着如果你有一个名为

public Class(ILogger logger) 它将使用 ILogger 作为参数进行实例化。

例子:

var yourClassObject = Kernel.Resolve<IClass>();

如果您没有接口规范(并已注册),如果您想使用该具体类型(而不是通过接口)解析它,则需要将您的组件注册为具体类型。

于 2008-11-03T14:40:00.277 回答