Castle LoggingFacility

本文关键字:LoggingFacility Castle | 更新日期: 2023-09-27 17:53:23

在LoggingFacility文档(http://docs.castleproject.org/Windsor.Logging-Facility.ashx)中有如下说明:

"允许你请求一个ILoggerFactory实例来为不受Windsor管理的类提供日志记录支持"

但我如何实际要求一个ILoggerFactory实例,如果我的类不是由温莎管理??

TIA

Søren

继续说:

我对使用Windsor (IoC)很陌生,所以当你说"为什么你不使用Windsor的类管理器"时,我开始怀疑你是否说所有的类都应该由Windsor来管理…

我正在处理一些遗留代码,必须在其上创建一个服务接口…比如:

namespace RESTServer.WindsorTestService
{
 [ServiceContract(Namespace = "urn: RESTServer_WindsorTestService:IMyServiceClass")]
    public interface IMyServiceClass
    {
        ILogger Logger // Will be injected by Windsor
        { get; set; }
        [OperationContract]
        [WebGet(UriTemplate = "MyMethod")]
        int MyServiceMethod();
    }
    [AspNetCompatibilityRequirements(RequirementsMode =     AspNetCompatibilityRequirementsMode.Allowed)]
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    public class MyServiceClass : IMyServiceClass
    {
        private ILogger _logger = NullLogger.Instance;
        public ILogger Logger // Will be injected by Windsor
        {
            get { return _logger; }
            set { _logger = value; }
        }
        public int MyServiceMethod()
        {
            // ... which will populate val1, val2, val3
            var val1 = 1;
            var val2 = 10;
            var val3 = 100;
            var myCalc = new myLegacyClass(val1, val2, val3);
            return myCalc.DoCalculate(1000);
        }
    }
    public class myLegacyClass
    {
        private int _val1;
        private int _val2;
        private int _val3;
        private static readonly ILog _logger = LogManager.GetLogger(typeof(myLegacyClass));
        public myLegacyClass(int val1, int val2, int val3)
        {
            _val1 = val1;
            _val2 = val2;
            _val3 = val3;
        }
        public int DoCalculate(int val4)
        {
            _logger.Info("Doing some calculation");
            return _val1 + _val2 + _val3;
        }
    }
}

,遗留代码已经使用log4net....它工作正常,但我想知道是否应该更改myLegacyClass以某种方式从Windsor获得记录器…我只是不确定最好的方法是什么.....

TIASøren

Castle LoggingFacility

container.Resolve<ILoggerFactory>(),您自己管理工厂并抓取记录器。但问题是,为什么你不选择温莎的班级经理呢?

使用LoggingFacility的目的当然是为了让Windsor的配置满足您的日志记录需求,并且您的组件不关心使用的是什么记录器(如果有的话?!)

Jak Charloton有一个很好的介绍

http://devlicio.us/blogs/casey/archive/2008/06/18/logging-with-castle-windsor-the-logging-facility-and-log4net.aspx

它展示了如何使用可选属性依赖注入来获取记录器实例。

如果你必须从不是通过Windsor容器创建的组件中获取ILogger的句柄,那么你可以使用ServiceLocator(例如Microsoft.Practices.ServiceLocation)配置来与Windsor容器对话,并以这种方式获取它。

var logger = ServiceLocator.Current.GetInstance(typeof(ILogger)) as ILogger

ServiceLocator是一个相当有代码味道的东西,如果可能的话应该避免使用——直接使用Windsor容器也是一样。

问题是"为什么你不让Windsor来管理这个班?"不是声称自己是DI/IOC方面的专家,但我的理解是,您的领域类(例如模型)通常不会由DI/IOC管理。然而,如果你的一个域类需要做一些日志记录,那么它将需要ILogger。

我一直在问同样的问题,并且由于两个解决方案都标记了可能的代码气味,我想知道是否有一个更干净的解决方案。

为了回答这个问题,我过去是这样做的:

var factory = ServiceLocator.Current.GetInstance<ILoggerFactory>
var logger = factory.Create(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

这将得到您所需要的,但是,在这些实例中,它并不比直接引用log4net更好。

当使用IoC和处理遗留类时,有时会变得很痛苦。