微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用工厂时,C#Castle Windsor不注入NLog实例

如何解决使用工厂时,C#Castle Windsor不注入NLog实例

问题是,当我使用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;
        }
    }

该工厂正在注册为工厂,并且ICam实例已注册名称cameratypename。然后使用ICameraFactoryICameraFactory 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 举报,一经查实,本站将立刻删除。