由于以下原因,我的使用者无法从Autofac实例化:
无法解析参数“ Microsoft.Extensions.Logging.Logger
1[MyConsumer] logger' of constructor 'Void .ctor(MyService, Microsoft.Extensions.Logging.Logger
1 [MyConsumer])”。
ILogger在除MassTransit消费者之外的所有其他类别中都可以解决。我相信这是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])'。*
套件版本:
无法解析参数
Microsoft.Extensions.Logging.Logger 1[MyConsumer] logger
此错误消息表示Autofac找不到已注册的Logger<MyConsumer>
。如果您查看自己的注册ILogger<>
,则不会注册Logger<>
。您应该将依赖项更改为其中的接口版本MyConsumer
,autofac会找到它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句