c# - 在 MassTransit 6.0 中使用 Autofac 的 NLog?
问题描述
由于以下原因,我的消费者无法从 Autofac 实例化:
无法解析参数“Microsoft.Extensions.Logging.Logger
1[MyConsumer] logger' of constructor 'Void .ctor(MyService, Microsoft.Extensions.Logging.Logger
1[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])'.*
软件包版本:
- Autofac.Extensions.DependencyInjection 5.0.1
- 大众运输 6.0
- MassTransit.Autofac 6.0
- NLog.Extensions.Logging 1.6.1
解决方案
无法解析参数
Microsoft.Extensions.Logging.Logger 1[MyConsumer] logger
此错误消息意味着Autofac找不到已注册的Logger<MyConsumer>
. 如果您查看您的注册信息,您就注册了ILogger<>
,而不是Logger<>
. 您应该将依赖项更改为接口版本MyConsumer
,autofac会找到它。
推荐阅读
- apache-spark - SparkSQL 任务数
- post - SwaggerUI 在 POST 请求中缺少 contenType 标头
- powershell - 在 Powershell 中总结总通话时间的脚本
- umbraco - 如何在 Umbraco 默认弹出窗口中发送错误消息?
- java - 使用 Java FileSystem 抢救临时 zip 文件
- cron - 从早上 8 点到晚上 7:30 每分钟运行一次的作业的 Cron 计划
- c# - 使用 Office Interop 导出 Excel 工作表时出现问题
- html - 如何在手机视图的右上角显示社交媒体图标?
- php - 使用内部连接选择 COUNT
- android - 无法解析 com.android.tools.build:gradle:3.3.0-alpha06