【发布时间】:2021-09-16 20:08:08
【问题描述】:
假设我们有以下Program.cs:
public static class Program
{
public static async Task Main(string[] args)
{
await CreateWebHostBuilder(args).Build().RunAsync();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
return WebHost
.CreateDefaultBuilder(args)
.ConfigureKestrel(options => { options.AllowSynchronousIO = false; })
.ConfigureFanciness()
.ConfigureLogging(ConfigureApplicationLogging)
.UseStartup<Startup>();
}
private static void ConfigureApplicationLogging(WebHostBuilderContext context, ILoggingBuilder loggingBuilder)
{
var loggingConfiguration = context.Configuration.GetSection("Logging");
loggingBuilder.AddConfiguration(loggingConfiguration);
// var fancyService = SomehowGet<IFancyService>();
// if (fancyService.IsEnabled)
// loggingBuilder.AddEventLog(loggingConfiguration);
}
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>();
// var fancyService = SomehowGet<IFancyService>();
// fancyService.Initialize();
});
}
}
还有以下FancyService.cs:
public sealed class FancyService : IFancyService
{
private readonly ILogger<FancyService> logger;
private readonly IOptions<FancinessSettings> settings;
public FancyService(ILogger<FancyService> logger, IOptions<FancinessSettings> settings)
{
this.logger = logger;
this.settings = settings;
}
public bool IsEnabled { get; private set; }
public void Initialize()
{
// do the initialization work and set IsEnabled to some value
}
}
如示例文件中所示,loggingBuilder.AddEventLog(loggingConfiguration) 依赖于在调用IFancyService.Initialize() 时设置的IFancyService.IsEnabled。
为此,我需要访问IFancyService 的实例;有没有办法做到这一点?
【问题讨论】:
-
我认为更多关于该服务正在做什么以及初始化做什么的上下文对我来说是必需的,我可以看到一些这样做的方法,但这取决于服务。是不是不能在构造函数中注册初始化?
-
虽然不确定发表评论的目的,但感觉有些颠倒,请问
isEnabled的目的是什么? -
虽然可以在实际构建
WebHost之前引用IFancyService,但我认为您的代码设计不佳:您的IFancyService需要ILogger<>服务和一个ILogger<>服务需要ILoggerFactory服务,它使用ILoggerProvider和其他选项来创建这样的实例。它现在工作得很好。但是如果要根据IFancySerivce.IsEnabled来配置日志记录行为,最终会引入一个循环依赖。 -
@KieranDevlin, @Jaya,你能帮我理解为什么知道
Initialize()做什么以及IsEnabled是什么的细节很重要吗?你可以把前者想象成我不想在构造函数中做的工作,比如从磁盘读取文件或从网络中读取数据,而前者是处理文件或流中数据的结果。是的,可以注册一个初始化的FancyService,但是我需要手动创建它的依赖关系,ILogger<FancyService>和IOptions<FancinessSettings>。 -
@itminus,我知道循环依赖的样子。但是,在这种情况下,
CreateDefaultBuilder(args)已经配置了默认记录器,ConfigureApplicationLogging()只是在IFancySerivce.IsEnabled时添加更多。无论如何,如果您有更好的想法来实现我正在尝试做的事情,请告诉我。
标签: c# asp.net-core