簡體   English   中英

在 MassTransit 6.0 中使用 Autofac 的 NLog?

[英]NLog with Autofac in MassTransit 6.0?

由於以下原因,我的消費者無法從 Autofac 實例化:

無法解析1[MyConsumer] logger' of constructor 'Void .ctor(MyService, Microsoft.Extensions.Logging.Logger 1[MyConsumer])”的參數“Microsoft.Extensions.Logging.Logger 1[MyConsumer] logger' of constructor 'Void .ctor(MyService, Microsoft.Extensions.Logging.Logger ”。

除了 MassTransit Consumer 之外,ILoggers 在其他所有類中都能很好地解析; 我相信這是 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
  • 大眾運輸.Autofac 6.0
  • NLog.Extensions.Logging 1.6.1

無法解析參數Microsoft.Extensions.Logging.Logger 1[MyConsumer] logger

此錯誤消息意味着Autofac找不到已注冊的Logger<MyConsumer> 如果您查看您的注冊,您注冊的是ILogger<>而不是Logger<> 您應該將依賴項更改為MyConsumer的接口版本, autofac會找到它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM