How-To: Get Started with Configuration
Uno.Extensions.Configuration
provides you with a consistent way to view configuration data from a number of distinct sources. It leverages the IOptions<T>
interface from Microsoft.Extensions.Options to offer read-only access to values organized into sections. Unlike the Writable Configuration (aka Settings) pattern, this does not allow for programmatic writing by itself.
Step-by-step
Important
This guide assumes you used the template wizard or dotnet new unoapp
to create your solution. If not, it is recommended that you follow the Creating an application with Uno.Extensions documentation to create an application from the template.
1. Installation
Add
Configuration
to the<UnoFeatures>
property in the Class Library (.csproj) file. If you already haveExtensions
in<UnoFeatures>
, thenConfiguration
is already installed, as its dependencies are included with theExtensions
feature.<UnoFeatures> Material; + Configuration; Toolkit; MVUX; </UnoFeatures>
2. Specify configuration information to load on IConfigBuilder
Uno.Extensions apps specify which configuration information to load by calling the
UseConfiguration()
extension method forIHostBuilder
.Use the
EmbeddedSource<T>()
extension method onIConfigBuilder
to load configuration information from an assembly type you specify:protected override void OnLaunched(LaunchActivatedEventArgs args) { var appBuilder = this.CreateBuilder(args) .Configure(host => { host.UseConfiguration(configure: configBuilder => configBuilder // Load configuration information from appsettings.json .EmbeddedSource<App>() ); }); ... }
By default, this method will extract values from an embedded resource (using the EmbeddedResource file build action) called
appsettings.json
, unless you optionally denote a different file name. The string you pass into the extension method will be concatenated in-betweenappsettings
and its file extension. For instance, the following will also retrieve values from the fileappsettings.platform.json
embedded inside theApp
assembly:protected override void OnLaunched(LaunchActivatedEventArgs args) { var appBuilder = this.CreateBuilder(args) .Configure(host => { host.UseConfiguration(configure: configBuilder => configBuilder // Load configuration information from appsettings.json .EmbeddedSource<App>() // Load configuration information from appsettings.platform.json .EmbeddedSource<App>("platform") ); }); ... }
3. Define a class to model the configuration section
Your JSON file(s) will consist of a serialized representation of multiple properties and their values. Hence, configuration sections allow you to programmatically read a specific subset of these properties from the instantiated class that represents them.
Author a new class or record with related properties to be used for configuration:
public record Auth { public string? ApplicationId { get; init; } public string[]? Scopes { get; init; } public string? RedirectUri { get; init; } public string? KeychainSecurityGroup { get; init; } }
4. Load a specific configuration section
You can now use the
Section<T>()
extension method onIConfigBuilder
to load configuration information for class or record of the type argument you specify:protected override void OnLaunched(LaunchActivatedEventArgs args) { var appBuilder = this.CreateBuilder(args) .Configure(host => { host.UseConfiguration(configure: configBuilder => configBuilder // Load configuration information from appsettings.json .EmbeddedSource<App>() // Load configuration information from appsettings.platform.json .EmbeddedSource<App>("platform") // Load configuration information for the Auth section .Section<Auth>() ); }); ... }
5. Read configuration section values from a registered service
To access the instantiated representation of the configuration section you registered above, complete with values populated from the
appsettings.json
file, you'll need to add a new constructor parameter for it to one of your application's services.The configuration section will be injected as an object of type
IOptions<T>
, so add a corresponding parameter for it to the constructor of the service:public class AuthenticationService : IAuthenticationService { public AuthenticationService(IOptions<Auth> settings) { var authSettings = settings.Value; ... } ... }