【问题标题】:C# Castle Windsor does not inject NLog instance when using factoryC# Castle Windsor 使用工厂时不注入 NLog 实例
【发布时间】: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


    【解决方案1】:

    我建议将 Log 的声明放在类定义中,并将实例化放在类的构造函数中。之后,您可以在方法中调用例如 Log.Info() 。 https://github.com/NLog/NLog/wiki/Getting-started-with-.NET-Core-2---Console-application

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多