Configuration
Introduction
ASP.NET Core provides a robust configuration system that can handle various configuration sources such as JSON files, environment variables, command-line arguments, and more. This tutorial will guide you through the process of setting up and using configuration in an ASP.NET Core application.
Setting Up the Development Environment
Before you start, ensure you have the following installed:
- Visual Studio 2019 or later
- .NET Core SDK
Example: Installing .NET Core SDK
https://dotnet.microsoft.com/download/dotnet-core
Creating a New ASP.NET Core Project
Open Visual Studio and create a new project:
- Select "Create a new project".
- Choose "ASP.NET Core Web Application" and click "Next".
- Name your project and select the location to save it. Click "Create".
- In the "Create a new ASP.NET Core Web Application" dialog, select "Web Application (Model-View-Controller)" and click "Create".
Understanding Configuration in ASP.NET Core
Configuration in ASP.NET Core is handled by the IConfiguration
interface, which allows access to configuration values from various sources. The configuration system is initialized in the Startup
class.
Adding Configuration Sources
You can add multiple configuration sources in the Program.cs
file. The most common sources include JSON files, environment variables, and command-line arguments.
Example: Adding Configuration Sources
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) =>
{
config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
config.AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true);
config.AddEnvironmentVariables();
if (args != null)
{
config.AddCommandLine(args);
}
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup();
});
}
Accessing Configuration Values
Once you have configured the configuration sources, you can access the configuration values in your application. The IConfiguration
interface is injected into the Startup
class and other services where needed.
Example: Accessing Configuration Values
public class Startup
{
private readonly IConfiguration _configuration;
public Startup(IConfiguration configuration)
{
_configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
// Access configuration values
var mySettingValue = _configuration["MySettingKey"];
services.AddControllersWithViews();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}
Binding Configuration to Objects
Configuration values can be bound to objects, making it easier to manage and access configuration settings. Here’s how you can bind configuration values to a custom object:
Example: Binding Configuration to Objects
public class MySettings
{
public string Setting1 { get; set; }
public string Setting2 { get; set; }
}
public class Startup
{
private readonly IConfiguration _configuration;
public Startup(IConfiguration configuration)
{
_configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
// Bind configuration values to MySettings object
var mySettings = new MySettings();
_configuration.GetSection("MySettings").Bind(mySettings);
services.AddSingleton(mySettings);
services.AddControllersWithViews();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Middleware configuration
}
}
Using Options Pattern
The options pattern is a preferred way to bind configuration settings to objects and inject them into services. This pattern uses the IOptions
interface. Here’s how to use the options pattern:
Example: Using Options Pattern
public class MySettings
{
public string Setting1 { get; set; }
public string Setting2 { get; set; }
}
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.Configure<MySettings>(Configuration.GetSection("MySettings"));
services.AddControllersWithViews();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Middleware configuration
}
}
public class HomeController : Controller
{
private readonly IOptions<MySettings> _settings;
public HomeController(IOptions<MySettings> settings)
{
_settings = settings;
}
public IActionResult Index()
{
var setting1 = _settings.Value.Setting1;
var setting2 = _settings.Value.Setting2;
// Use settings
return View();
}
}
Using Environment Variables
Environment variables can be used to override configuration values without changing the configuration files. This is useful for managing sensitive information and different configurations for various environments.
Example: Using Environment Variables
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) =>
{
config.AddEnvironmentVariables();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
Conclusion
Congratulations! You have learned the basics of configuration in ASP.NET Core. This tutorial covered setting up a new project, adding configuration sources, accessing configuration values, binding configuration to objects, using the options pattern, and using environment variables. From here, you can further explore more advanced topics like managing hierarchical configuration settings, reloading configuration values at runtime, and integrating third-party configuration providers.