I'm using asp.net + Autofac.
I'm trying to load a custom JSON configuration file, and either create/instance an IConfiguration instance based on that, or at least include my file into whatever IConfiguration asp.net builds by default.
My problem is that asp.net seems to override the dependency registration for IConfiguration.
I can't seem to register my own IConfiguration object - the DI container will always resolve this to some instance that seems to have been generated by the asp.net library itself.
And I'm not sure how I can get asp.net to at least load my custom config file additionally - i.e. if there is any way to get a hold of the ConfigurationBuilder it uses, and add my own file before it is building the IConfiguration object.
I've tried the following:
public class Startup
{
public IConfigurationRoot Configuration { get; }
public Startup(IHostingEnvironment env)
{
this.Configuration = new ConfigurationBuilder()
.SetBasePath(path)
.AddJsonFile("somefile.json")
.Build();
}
public IServiceProvider ConfigureServices(IServiceCollection services)
{
// Add framework services.
services
.AddMvc()
.AddControllersAsServices();
var builder = new ContainerBuilder();
builder.Register(x => this.Configuration).As<IConfiguration>();
builder.Populate(services);
var container = builder.Build();
// This will return another IConfiguration instance then the one I registered;
// namely One that contains 1 provider, a MemoryConfigurationProvider
var xxx = container.Resolve<IConfiguration>();
return new AutofacServiceProvider(container);
}
}
How can I get asp.net to load my custom JSON config file as well?
Add Json File After adding the file, right click on appsettings. json and select properties. Then set “Copy to Ouptut Directory” option to Copy Always. Add few settings to json file, so that you can verify that those settings are loaded.
Double-click the config. json file, or right-click the file and select Open with > PDK JSON Editor.
Different configuration json files in ASP.net Core There are mainly 6 configuration JSON files in ASP.net Core. global.json launchsettings.json appsettings.json bundleconfig.json project.json bower.json.
For .Net Core 2.2, you need to modify Program.cs:
Before
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
After
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
//This is how you attach additional JSON files
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.AddJsonFile("customSettings.json", optional: false, reloadOnChange: false);
})
//End of update
.UseStartup<Startup>();
For the latest amendments and to add other kinds of custom settings, please refer to Microsoft documentation at the following article.
You can do this by using the Options pattern:
On ASP.NET Core 2, register the config file on Program.cs
public class Program
{
public static void Main(string[] args)
{
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
// custom config file
.AddJsonFile("myappconfig.json", optional: false, reloadOnChange: false)
.Build();
BuildWebHost(args, configuration).Run();
}
public static IWebHost BuildWebHost(string[] args, IConfiguration config) =>
WebHost.CreateDefaultBuilder(args)
.UseConfiguration(config)
.UseStartup<Startup>()
.Build();
}
Create a class that matches with your config file:
public class MyAppConfig
{
public string SomeConfig { get; set; }
public int NumberConfig { get; set; }
}
Register it on ConfigureServices
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.Configure<MyAppConfig>(Configuration);
}
Then, just access it in your Controller:
[Route("api/[controller]")]
public class ValuesController : Controller
{
private readonly MyAppConfig _appConfig;
public ValuesController(IOptions<MyAppConfig> optionsAccessor)
{
if (optionsAccessor == null) throw new ArgumentNullException(nameof(optionsAccessor));
_appConfig = optionsAccessor.Value;
}
// GET api/values/5
[HttpGet("{id}")]
public string Get(int id)
{
return _appConfig.SomeConfig;
}
}
If you are not in ASP.NET Core 2 yet, the process is almost the same. You just need to add the custom config file on Startup.cs
. The rest is basically the same.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With