I saw code to add a provider (let's say the extention method to add this provider is called AddXXX) in startup.cs:
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder() // have to do tedious setup which can be done by program.cs
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json",
optional: false,
reloadOnChange: true)
.AddEnvironmentVariables();
if (env.IsDevelopment())
{
builder.AddXXX();
}
Configuration = builder.Build();
... // setup other middlewares
}
But considering we have already used a default hostbuilder in program.cs:
public class Program
{
public static void Main(string[] args) {
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => {
webBuilder.UseStartup<Startup>();
});
}
I don't want to configure ConfigurationBuilder again, which is quite tedious, e.g add json file provider which is already added by CreateDefaultBuilder, so I feel that the most efficient way is to add the provider in program.cs as:
public class Program
{
public static void Main(string[] args) {
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) => {
if (hostingContext.HostingEnvironment.IsDevelopment()) {
config.AddXXX();
}
})
.ConfigureWebHostDefaults(webBuilder => {
webBuilder.UseStartup<Startup>();
});
}
Is my thinking correct?
From here
... the following service types can be injected into the Startup constructor when using the Generic Host (IHostBuilder):
- IWebHostEnvironment
- IHostEnvironment
- IConfiguration
So what you can do is;
public class Startup
{
private readonly IWebHostEnvironment _env;
private readonly IConfiguration _config;
public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
_config = configuration;
_env = env;
}
...
}
With environment specific configuration defined in your CreateHostBuilder method, as in your question.