Как обсуждалось в комментариях, если ваш FancyService
не имеет зависимости конструктора от ILogger<>
:
public sealed class FancyService : IFancyService
{
public FancyService(IOptions<FancinessSettings> settings)
{ ... }
для инициализации IFancyService
, просто используйте фабрику реализации , чтобы создать IFancyService
экземпляр:
public static IWebHostBuilder ConfigureFanciness(this IWebHostBuilder hostBuilder)
{
return hostBuilder.ConfigureServices(delegate (WebHostBuilderContext context, IServiceCollection services)
{
var fancinessConfiguration = context.Configuration.GetSection("Fanciness");
services.Configure<FancinessSettings>(fancinessConfiguration);
services.AddSingleton<IFancyService, FancyService>(sp =>{
var fancy=ActivatorUtilities.CreateInstance(sp,typeof(FancyService)) as FancyService;
fancy.Initialize();
return fancy;
});
});
}
Тот же прием можно использовать и для регистрации провайдера логгеров. Поскольку служба ILogger<>
зависит от IEnumberable<ILoggerProvider>
, мы могли бы зарегистрировать экземпляр ILoggerProvider
, который предоставляет дополнительный INullLogger
для настройки поведения ведения журнала в соответствии с текущим IFancyService
:
private static void ConfigureApplicationLogging(WebHostBuilderContext context, ILoggingBuilder loggingBuilder)
{
var loggingConfiguration = context.Configuration.GetSection("Logging");
var descriptor=ServiceDescriptor.Singleton<ILoggerProvider,NullLoggerProvider>(sp =>{
var provider = NullLoggerProvider.Instance;
var fancy = sp.GetRequiredService<IFancyService>();
if(fancy.IsEnabled)
{
loggingBuilder.AddDebug();
loggingBuilder.AddEventLog(loggingConfiguration);
loggingBuilder.AddEventSourceLogger();
// ... add more configuration as you like
}else{
loggingBuilder.AddConsole();
}
return provider;
});
loggingBuilder.Services.TryAddEnumerable(descriptor);
loggingBuilder.AddConfiguration(loggingConfiguration);
}
В качестве примечания, будьте внимательны, как только регистратор будет построен, не меняйте IFancyService.IsEnabled
. Это связано с тем, что сервис ILogger<>
зарегистрирован как одноэлементный и никогда не менялся после создания.