Передача ILogger в DI в консоли ядра .net приводит к ошибке службы не зарегистрированной - PullRequest
0 голосов
/ 14 января 2019

У меня есть сервис, который я использую в ASP.NET Core 2.2 и хотел бы использовать в консольном приложении .NET Core 2.2. К вашему сведению, я использую Serilog из конфигурации, если это имеет какое-либо значение

Класс для справки / использования

public RabbitMq(ILogger<RabbitMq> logger, ...)
    {
       ...
        this.logger = logger;

    }

ASP.NET CORE Startup.cs ВСЕ РАБОТАЕТ В ASP.NET CORE

 var busConfig = Configuration.GetSection("RabbitMQ").Get<RabbitMqConf>();
        services.AddSingleton<IEventBus, RabbitMq>(x =>
        {
            var logger = x.GetRequiredService<ILogger<RabbitMq>>();
            return new RabbitMq(logger, busConfig.Host, busConfig.Username, busConfig.Password, busConfig.Queue, busConfig.RetryCount);
        });

Как вы видите, я могу использовать .GetRequiredService<ILogger<RabbitMq>>, и он корректно возвращает регистратор для перехода в ctor из RabbitMq

.NET Core 2.2 Консоль Ошибка приложения

System.InvalidOperationException: «Нет службы для типа 'Microsoft.Extensions.Logging.ILogger`1 [RabbitMQ.RabbitMq]' был зарегистрирован. '

На этой строке var logger = x.GetRequiredService<ILogger<RabbitMq>>();

class Program
{
    private static string _env;
    public static IConfigurationRoot Configuration { get; private set; }

    static Program()
    {


        Configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json")
            .Build();

        Log.Logger = new LoggerConfiguration()
            .ReadFrom.Configuration(Configuration)
            .CreateLogger();

        Log.Information($"Environment: {_env}");
    }

    static void Main(string[] args)
    {
        var busConfig = Configuration.GetSection("RabbitMQ").Get<RabbitMqConf>();

        var serviceProvider = new ServiceCollection()

            .AddSingleton<IEventBus, RabbitMq>(x =>
            {
                var logger = x.GetRequiredService<ILogger<RabbitMq>>();

                return new RabbitMq(logger, busConfig.Host, busConfig.Username, busConfig.Password, busConfig.Queue, busConfig.RetryCount);
            })

            .BuildServiceProvider();

        var eventBus = serviceProvider.GetService<IEventBus>();
        eventBus.Subscribe<CoinAddedEvent, CoinAddedEventHandler>();


    }
    public class CoinAddedEvent : IntegrationEvent
    {
        public string Name { get; set; }
    }

    public class CoinAddedEventHandler
        : IIntegrationEventHandler<CoinAddedEvent>
    {
        public Task Handle(CoinAddedEvent @event)
        {
            Console.WriteLine(@event.Name);
            return Task.FromResult<object>(null);
        }
    }
}
...