Použití appsettings.json v UWP

ASP.NET Core jako první integroval náhradu tradiční XML konfigurace v .NETu přes App.config a Web.config, kterou jsme používali od… prakticky odjakživa. Moderní konfigurační systém Microsoft.Extensions.Configuration.* je snadno rozšiřitelný a flexibilní. A protože nemá žádnou závislost na ASP.NET Core, lze jej snadno použít v jakékoliv .NET aplikaci! V tomto článku si ukážeme, jak zprovoznit JSON konfiguraci přes appsettings.json v UWP.

Instalace NuGet balíčků

Všechny knihovny pro novou konfiguraci jsou k dispozici na NuGetu. Pro naše potřeby stačí následující dva balíčky:

Verze 3.x těchto balíčků popdoruje .NET Standard 2.0.

Nastavení konfigurace

Abychom měli konfigurační logiku pohromadě, vytvoříme si třídu AppConfig. V jejím konstruktoru potřebujeme nastavit konfigurační pipeline. Protože je JSON soubor dodáván spolu s aplikací, nastavíme výchozí cestu pro vyhledávání na Package.Current.InstalledLocation.Path. Do pipeline pak přidáme appsettings.json:

private readonly IConfigurationRoot _configurationRoot;
public AppConfig()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Package.Current.InstalledLocation.Path)
.AddJsonFile("appsettings.json", optional: false);
_configurationRoot = builder.Build();
}

Nyní do našeho projektu přidáme soubor appsettings.json. Pro ilustraci do něj přidáme jedno ukázkové nastavení:

{
"example": {
"message" : "Hello from appsettings.json!"
}
}

view raw
appsettings.json
hosted with ❤ by GitHub

Důležitá poznámka – ujistěte se, že soubor appsettings.json má svou Build Action nastavenu na Content a Copy to Output Directory na Copy Always, aby byl opravdu nakopírován do výstupu. Změny lze provést v okně Properties po výběru souboru v Solution Exploreru:

Ensure the json file is set as Content file
Ensure the JSON file is set as Content file

Načtení konfiguračních sekcí

Aby bylo načítání silně-typových konfiguračních sekcí jednoduché, připravíme si následující pomocnou metodu:

private T GetSection<T>(string key) => _configurationRoot.GetSection(key).Get<T>();

view raw
GetSection.cs
hosted with ❤ by GitHub

Nyní naši ukázkovou sekci pokryjeme jednoduchou třídou:

public class Example
{
public string Message { get; set; }
}

view raw
ExampleSection.cs
hosted with ❤ by GitHub

A vytvoříme vlastnost, kterou konfigurační sekci můžeme přečíst:

public Example Example => GetSection<Example>(nameof(Example));

view raw
ExampleProperty.cs
hosted with ❤ by GitHub

A to je vše! Nyní můžeme snadno použít třídu AppConfig kdekoliv, kde ji potřebujeme:

var config = new AppConfig();
var contentDialog = new ContentDialog()
{
Content = config.Example.Message,
CloseButtonText = "OK"
};
await contentDialog.ShowAsync();

view raw
ShowDialog.cs
hosted with ❤ by GitHub

A je to, naše zpráva z konfigurace je zobrazena!

Message from configuration
Message from configuration

Pokud používáte nějaký MVVM framework s podporou dependency injection, nejlepším způsobem pro použití konfigurace je extrahovat z naší třídy rozhraní a následně používat jeho singleton instanci namísto jejího manuálního vytváření.

Tip navíc

Skvělým plusem moderní konfigurace je možnost mít více zdrojů konfigurace, například soubor appsettings.production.json , který není uložen v Gitu a který se používá pouze pro Release buildy:

<ItemGroup Condition="'$(Configuration)' == 'Release'">
<Content Include="appsettings.production.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>

Nastavení pipeline by v tomto případě vypadalo takto:

var builder = new ConfigurationBuilder()
.SetBasePath(Package.Current.InstalledLocation.Path)
.AddJsonFile("appsettings.json", optional: false)
.AddJsonFile("appsettings.production.json", optional: true);

Bohužel, UWP projekty nemohou v tuto chvíli používat nový SDK-styl csproj a Visual Studio má problém tento “podmíněný” soubor správně zobrazovat/skrývat při přepnutí build konfigurace. I tak lze funkci bez problémů používat.

Zdrojový kód

Ukázkový zdrojový kód k tomuto článku je k dispozici na mém GitHubu.

Shrnutí

Je snadné přidat Microsoft.Extensions.Configuration do UWP projektu, či obecně – do kteréhokoliv .NET projektu. Viděli jsme, jak lze použít konfiguraci přes JSON ale díky rozšířitelnosti nic nebrání možnosti použít pro konfiguraci i jiné zdroje.

Buy me a coffeeBuy me a coffee

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.