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
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和处理遗留类时,有时会变得很痛苦。