Castle LoggingFacility

时间:2011-04-28 13:23:55

标签: c# logging castle-windsor

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

“允许您请求ILoggerFactory实例为不受Windsor管理的类提供日志记录支持”

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

TIA

索伦

续:

我很擅长使用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获取记录器...我只是不确定最好的方法是什么.....

TIA 索伦

4 个答案:

答案 0 :(得分:3)

container.Resolve<ILoggerFactory>()你管理工厂并自己抓住伐木工。问题是 - 为什么你不会有温莎的班级经理?

答案 1 :(得分:1)

使用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的句柄,那么您可以使用配置为与Windsor容器通信的ServiceLocator(例如Microsoft.Practices.ServiceLocation)并获取它那样。

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

ServiceLocator相当于代码味道,如果可能的话应该避免 - 同样直接使用Windsor容器。

答案 2 :(得分:0)

问题是“你为什么不让温莎管理班级”。没有声称自己是DI / IOC的专家,但我的理解是你的域类,例如模型通常不会由DI / IOC管理。但是,如果您的某个域类需要进行一些日志记录,那么它将需要ILogger。

我一直在问同样的问题,因为两种解决方案都标有可能的代码味道,我想知道是否有更清洁的解决方案。

答案 3 :(得分:0)

要回答这个问题,这就是我过去所做的:

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

这将为您提供所需的功能,但话说再说一次,并不比直接在这些实例中引用log4net更好。

使用IoC并处理遗留类时,有时会很痛苦。