Injecting NLog with Autofac's RegisterGeneric

后端 未结 2 813
时光取名叫无心
时光取名叫无心 2020-12-14 13:05

Note: Updated with suggested improvements, closer but still not quite there!

Similar to this question - Passing in the type of the declaring class for NLog using Aut

2条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-14 13:48

    For those using ILogger from Microsoft.Extensions.Logging namespace together with NLog.Extensions.Logging Nuget package.

    public class NLoggerModule : Module
    {
        private readonly NLogLoggerProvider _provider;
    
        public NLoggerModule()
        {
            _provider = new NLogLoggerProvider();
        }
    
        protected override void Load(ContainerBuilder builder)
        {
            builder.Register(CreateLogger).AsImplementedInterfaces();
        }
    
        private ILogger CreateLogger(IComponentContext c, IEnumerable p)
        {
            var logger = _provider.CreateLogger(p.TypedAs().FullName);
            return logger;
        }
    
        protected override void AttachToComponentRegistration(IComponentRegistry componentRegistry, IComponentRegistration registration)
        {
            registration.Preparing += Registration_Preparing;
        }
    
        private void Registration_Preparing(object sender, PreparingEventArgs args)
        {
            var forType = args.Component.Activator.LimitType;
    
            var logParameter = new ResolvedParameter(
                (p, c) => p.ParameterType == typeof(ILogger),
                (p, c) => c.Resolve(TypedParameter.From(forType)));
    
            args.Parameters = args.Parameters.Union(new[] { logParameter });
        }
    }
    

提交回复
热议问题