问题描述
问题是,当我使用Windsor.Castle(WC)的LoggingFacility时,使用自定义工厂类创建类时,ILogger实例仍然是NullLogger实例。创建没有自定义工厂的实例会将ILogger设置为NLog实例。这些类的实例的类型为ICam
,并使用唯一的名称注册。
NLog正在注册为日志记录工具
container.AddFacility<LoggingFacility>(m => m.LogUsing<NLogFactory>().WithConfig("NLog.config"));
public ILogger Log { get; set; } = NullLogger.Instance;
我正在使用此自定义工厂实现(为便于阅读而缩短了位)。它只会覆盖GetComponentName
方法以获取正确的名称,以便WC可以创建正确的类的实例。
public class CameraTypeFactory : DefaultTypedFactoryComponentSelector
{
protected override string GetComponentName(MethodInfo method,object[] arguments)
{
if (!(arguments?.Length > 0))
{
return "UnkNown";
}
if (!(arguments[0] is ICameraInfo cameraInfo))
{
return "UnkNown";
}
string cameraType = cameraInfo.GetValueOrDefault(CameraInfoKey.DeviceType,"UnkNown");
return cameraType;
}
}
该工厂正在注册为工厂,并且ICam实例已注册为名称cameratypename
。然后使用ICameraFactory
像ICameraFactory factory.Create(cameraInfo)
来创建实例,其中cameraInfo
实现接口ICameraInfo
。
container
.Register(
Component
.For<ICameraFactory>()
.AsFactory(new CameraTypeFactory())
)
.Register(
Component
.For<ICam>()
.ImplementedBy<Camera>()
.Named("cameratypename")
);
容器是IWindsorContainer
。 ICameraFactory定义为:
public interface ICameraFactory
{
ICam Create(ICameraInfo cameraInfo);
}
工作正常,我得到了正确类的实例,但是没有日志记录实例,尽管所有内容都是使用WC创建的,但它仍然是NullLogger。工厂类需要更多的覆盖还是我做错了其他事情?
解决方法
我建议将Log声明放入类定义中,并将实例化放入类的构造函数中。之后,您可以在方法内部调用例如Log.Info()。 https://github.com/NLog/NLog/wiki/Getting-started-with-.NET-Core-2---Console-application