问题是,当我使用LoggingFacility of Windsor.Castle (WC)时,ILogger实例仍然是一个NullLogger实例,而该类是使用自定义工厂类创建的。创建没有自定义工厂的实例会将ILogger设置为NLog实例。类的实例属于ICam
类型,并使用唯一的名称进行注册。
NLog正在注册为日志记录工具
container.AddFacility<LoggingFacility>(m => m.LogUsing<NLogFactory>().WithConfig("NLog.config"));
类定义包含一个NullLogger
实例:
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;
}
}
该工厂正在注册为工厂,并且使用名称cameratypename
注册了一个ICam实例。然后使用类似ICameraFactory factory.Create(cameraInfo)
的ICameraFactory
创建一个实例,其中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);
}
它工作了,我得到了一个正确类的实例,但是没有日志记录实例,它仍然是一个NullLogger,尽管所有的东西都是使用WC创建的。是工厂类需要更多重写,还是我做错了什么?
发布于 2020-10-27 17:58:42
我建议将Log的声明放在类定义中,并将实例化放在类的构造函数中。之后,您可以在您的方法中调用例如Log.Info()。https://github.com/NLog/NLog/wiki/Getting-started-with-.NET-Core-2---Console-application
https://stackoverflow.com/questions/64551092
复制相似问题