【问题标题】:Where & How Castle Windsor sets up logging facility温莎城堡在哪里以及如何建立伐木设施
【发布时间】:2012-11-12 17:47:33
【问题描述】:

我是温莎城堡的新手,正在调查伐木设施的进出。这似乎相当令人印象深刻,但我唯一无法解决的是 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 属性。

干杯 安东尼

【问题讨论】:

    标签: c# .net logging inversion-of-control castle-windsor


    【解决方案1】:

    记录器由记录工具设置,位于配置的<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>
    

    【讨论】:

      【解决方案2】:

      您也可以在初始化 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; }
          }
      

      【讨论】:

      • getter 是多余的。此属性存在的唯一原因是 Windsor 可以覆盖默认的空记录器。
      【解决方案3】:

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

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

      至少我是这么理解的。

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

      的构造函数

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

      例子:

      var yourClassObject = Kernel.Resolve();

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

      【讨论】:

      • 我希望我能在这里看到一个从容器中解析类的示例。
      • 谢谢,这证实我明白你在说什么。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多