如何解决使用工厂时,C#Castle Windsor不注入NLog实例
问题是,当我使用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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。