У меня есть сервис, который я использую в 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);
}
}
}