【发布时间】:2019-12-09 21:15:16
【问题描述】:
由于以下原因,我的消费者无法从 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”找到的任何构造函数都不能被可用的服务和参数调用:
无法解析构造函数“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