【发布时间】:2020-10-27 09:03:01
【问题描述】:
问题是,当我使用 Windsor.Castle (WC) 的 LoggingFacility 时,当使用自定义工厂类创建类时,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 创建一个实例,例如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);
}
它有效,我得到了一个正确类的实例,但没有日志记录实例,它仍然是一个 NullLogger,尽管一切都是使用 WC 创建的。工厂类是否需要更多覆盖,还是我做错了什么?
【问题讨论】:
标签: c# factory castle-windsor nlog