首页 > 解决方案 > 在 MassTransit 6.0 中使用 Autofac 的 NLog?

问题描述

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

无法解析参数“Microsoft.Extensions.Logging.Logger 1[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<ILogger<MyConsumer>>()我会得到一个 ILogger,但 MassTransit 似乎遇到了麻烦。

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

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

软件包版本:

标签: c#autofacnlogmasstransit

解决方案


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

此错误消息意味着Autofac找不到已注册的Logger<MyConsumer>. 如果您查看您的注册信息,您就注册了ILogger<>,而不是Logger<>. 您应该将依赖项更改为接口版本MyConsumerautofac会找到它。


推荐阅读