【问题标题】:NLog with Autofac in MassTransit 6.0?在 MassTransit 6.0 中使用 Autofac 的 NLog?
【发布时间】:2019-12-09 21:15:16
【问题描述】:

由于以下原因,我的消费者无法从 Autofac 实例化:

无法解析参数“Microsoft.Extensions.Logging.Logger1[MyConsumer] logger' of constructor 'Void .ctor(MyService, Microsoft.Extensions.Logging.Logger1[MyConsumer])”。

ILogger 在除 MassTransit Consumers 之外的所有其他类中都可以正常解析;我相信这是 LogContext.ConfigureCurrentLogContext(); 的问题。和操作顺序。以下是代码,为简洁而编辑:

ContainerBuilder builder = new ContainerBuilder(); // Autofac

builder.RegisterType<LoggerFactory>()
                         .As<ILoggerFactory>()
                         .SingleInstance();

builder.RegisterGeneric(typeof(Logger<>))
                         .As(typeof(ILogger<>))
                         .SingleInstance();

builder.RegisterAssemblyTypes() // load up all services, yada yada

// what to pass here? I'm inside an unbuilt Autofac Container at this point. There is no ILoggerFactory until the Container is built!
LogContext.ConfigureCurrentLogContext(); // configure MassTransit logging

builder.AddMassTransit(x => 
            {
                x.AddConsumers(Assembly.GetEntryAssembly());

                x.AddBus(bus => MassTransit.Bus.Factory.CreateUsingRabbitMq(config =>
                {
                    config.ConfigureEndpoints(bus); // wire-up consumers discovered by the AddConsumers() call above
                }));
            });

Container = builder.Build(); // now build the container

// add NLog
IServiceProvider serviceProvider = new AutofacServiceProvider(Container); // this requires a built Container!
ILoggerFactory loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();
loggerFactory.AddNLog();

我应该注意到,MassTransit 中的日志记录实际上是有效的;我看到所有关于队列和消息的调试输出。但无论出于何种原因,消费者都不会实例化。如果我尝试手动 Resolve&lt;ILogger&lt;MyConsumer&gt;&gt;() 我会得到一个 ILogger,但 MassTransit 似乎有问题。

编辑:通过 VS 输出的完整错误消息:

在“MyConsumer”类型上使用“Autofac.Core.Activators.Reflection.DefaultConstructorFinder”找到的任何构造函数都不能被可用的服务和参数调用:
无法解析构造函数“Void .ctor(MyService, Microsoft.Extensions.Logging.Logger`1[MyConsumer])”的参数“Microsoft.Extensions.Logging.Logger 1[MyConsumer] logger”。*

软件包版本:

  • Autofac.Extensions.DependencyInjection 5.0.1
  • 大众运输 6.0
  • MassTransit.Autofac 6.0
  • NLog.Extensions.Logging 1.6.1

【问题讨论】:

  • 您能分享完整的异常消息吗?
  • 我更新了它 - 不幸的是没有太多要添加的

标签: c# autofac nlog masstransit


【解决方案1】:

无法解析参数Microsoft.Extensions.Logging.Logger 1[MyConsumer] logger

此错误消息意味着 Autofac 找不到已注册的Logger&lt;MyConsumer&gt;。如果您查看您的注册信息,您注册的是ILogger&lt;&gt; 而不是Logger&lt;&gt;。您应该将依赖关系更改为MyConsumer 中的接口版本,autofac 会找到它。

【讨论】:

  • 正确!谢谢!我真的很欣赏第二双眼睛,我完全错过了那个讨厌的“我”
  • 在我的场景中似乎不需要 LogContext.ConfigureCurrentLogContext(),因为 A) 我无法将 ILoggerFactory 传递给它,并且 B) 它在没有调用的情况下工作。不知道为什么,但我会接受的。
  • 由于您使用的是注册 (.AddMassTransit),它会尝试从容器中解析 ILoggerFactory 并在找到时使用它。所以你们都很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多