Shiny.Extensions.Configuration 1.1.1

The ID prefix of this package has been reserved for one of the owners of this package by NuGet.org. Prefix Reserved
There is a newer version of this package available.
See the version list below for details.
dotnet add package Shiny.Extensions.Configuration --version 1.1.1
NuGet\Install-Package Shiny.Extensions.Configuration -Version 1.1.1
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Shiny.Extensions.Configuration" Version="1.1.1" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Shiny.Extensions.Configuration --version 1.1.1
#r "nuget: Shiny.Extensions.Configuration, 1.1.1"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Shiny.Extensions.Configuration as a Cake Addin
#addin nuget:?package=Shiny.Extensions.Configuration&version=1.1.1

// Install Shiny.Extensions.Configuration as a Cake Tool
#tool nuget:?package=Shiny.Extensions.Configuration&version=1.1.1

Xamarin Configuration for Microsoft.Extensions.Configuration

Nugets

Release NuGet
Stable Nuget
Preview Nuget (with prereleases)

Builds

Branch Status
Master Build
Dev Build
Preview Build

Features

  • All the power of IConfiguration
  • Load JSON from packaged sources (whitelabellers can unpack, edit, & repack the config)
  • Preferences based configuration source with writebacks
  • Support For
    • Xamarin
      • iOS
      • Android
      • Including Xamarin Forms 😛
    • .NET 6
      • Android
      • iOS
      • Including MAUI 😛

The Problem

Microsoft really did create a great set of abstractions for configuration. You can store a set of key/values, cause a reload when a configuration source changes, & bind to strongly typed objects using Microsoft.Extensions.Configuration.Binder. On Mobile though, NONE of the current providers aren't really well.

Why?

  • A big feature for IConfiguration, is the ability to trigger a reload of it's source without restarting the application. Changing an appsettings.json file during runtime causes the IConfiguration to trigger a reload notification.
  • Mobile doesn't really have an appsettings.json. Sure you could put this in an embedded resource, but than it is readonly at all times other than the build process... after that - it is locked in place
  • Essentially, IConfiguration becomes a string based dictionary for all intents and purposes - pretty useless considering

The Solution

How Shiny.Extensions.Configuration brings the power of IConfiguration to Mobile!

  • A platform preferences configuration source which allows you to WRITE a value back using IConfiguration[key] = value;
  • A whitelabellers dream - the ability to unpack, change a json config file, and repack without trigger a build by using proper platform directories to load up the JSON files while still having the power of a proper configuration library internally.

Setup

AppSettings JSON
  1. Install the NuGet package 'Shiny.Extensions.Configuration'
  2. Create an appsettings.json file like you would in ASP.NET Core application in your HEAD project.
    • ANDROID: place the file in: Assets. Ensure the build action on the file is set to 'AndroidAsset'
    • iOS: place the file in the ROOT of your project. Ensure the build action on the file is set to 'BundleResource'
  3. Configure your IConfiguration using the following code in your application startup code (ie. Xamarin.Forms App).
// store this in your dependency injection container OR static class
var config = new ConfigurationBuilder()
    .AddJsonPlatformBundle() // NOTE: you can change the name of appsettings.json to something else and pass as an argument here
    .Build();
Preferences Provider

This provider allows writes and persists across application restarts. It is a wrapper around the Android/iOS shared preferences.

  1. Install the NuGet package 'Shiny.Extensions.Configuration'
  2. For this configuration source, nothing special is required, simply add the following to the configuration builder:
var configuration = new ConfigurationBuilder()
    .AddPlatformPreferences()
    .Build();

NOTE: with the platform preferences provider, changes are supported.

IConfiguration config = ...; // build
config["key"] = "value"; // write - this will cause a persist to the platform prefs and also trigger Option reloated events
Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-android31.0 is compatible.  net6.0-ios was computed.  net6.0-ios15.2 is compatible.  net6.0-maccatalyst was computed.  net6.0-maccatalyst15.2 is compatible.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed.  monoandroid12.0 is compatible. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed.  xamarinios10 is compatible. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
4.0.0-beta-0040 72 6/14/2024
3.3.3 1,623 4/8/2024
3.3.3-beta-0007 75 4/8/2024
3.3.3-beta-0003 70 4/8/2024
3.3.2 256 3/26/2024
3.3.1 94 3/26/2024
3.3.0 209 3/18/2024
3.3.0-beta-0011 80 3/14/2024
3.3.0-beta-0009 84 3/12/2024
3.3.0-beta-0003 91 2/28/2024
3.2.4 864 2/3/2024
3.2.4-beta-0004 57 2/3/2024
3.2.4-beta-0002 63 2/2/2024
3.2.3 189 1/19/2024
3.2.2 515 1/3/2024
3.2.1 665 12/20/2023
3.2.0 265 12/11/2023
3.2.0-beta-0049 66 1/12/2024
3.2.0-beta-0042 86 1/3/2024
3.2.0-beta-0041 72 1/3/2024
3.2.0-beta-0034 70 12/20/2023
3.2.0-beta-0025 95 12/10/2023
3.2.0-beta-0022 117 11/29/2023
3.2.0-beta-0019 91 11/25/2023
3.2.0-beta-0010 114 11/11/2023
3.2.0-beta-0006 97 11/8/2023
3.1.2 746 11/8/2023
3.1.1 203 11/2/2023
3.1.0 208 10/27/2023
3.1.0-beta-0018 83 11/2/2023
3.1.0-beta-0007 96 10/17/2023
3.1.0-beta-0005 94 10/14/2023
3.1.0-beta-0004 82 10/14/2023
3.0.1 655 9/20/2023
3.0.1-beta-0016 90 9/20/2023
3.0.1-beta-0002 118 9/14/2023
3.0.0 566 9/5/2023
3.0.0-beta-0305 114 9/1/2023
3.0.0-beta-0301 99 8/31/2023
3.0.0-beta-0300 113 8/31/2023
3.0.0-beta-0296 123 8/28/2023
3.0.0-beta-0293 101 8/28/2023
3.0.0-beta-0292 109 8/28/2023
3.0.0-beta-0282 120 8/25/2023
3.0.0-beta-0277 139 8/20/2023
3.0.0-beta-0273 108 8/20/2023
3.0.0-beta-0257 133 8/15/2023
3.0.0-beta-0245 147 8/8/2023
3.0.0-beta-0241 333 7/31/2023
3.0.0-beta-0231 126 7/25/2023
3.0.0-beta-0230 124 7/25/2023
3.0.0-beta-0215 144 7/18/2023
3.0.0-beta-0210 362 7/12/2023
3.0.0-beta-0200 131 7/5/2023
3.0.0-beta-0199 135 7/5/2023
3.0.0-beta-0179 354 6/27/2023
3.0.0-beta-0174 137 6/26/2023
3.0.0-beta-0165 126 6/22/2023
3.0.0-beta-0154 137 6/17/2023
3.0.0-beta-0153 131 6/16/2023
3.0.0-beta-0124 523 6/1/2023
3.0.0-beta-0122 231 5/31/2023
3.0.0-beta-0116 123 5/30/2023
3.0.0-beta-0114 130 5/29/2023
3.0.0-beta-0092 166 5/16/2023
3.0.0-beta-0081 139 5/13/2023
3.0.0-beta-0073 119 5/12/2023
3.0.0-beta-0039 137 5/7/2023
3.0.0-beta-0031 116 5/5/2023
3.0.0-beta-0026 174 4/28/2023
3.0.0-beta-0023 134 4/26/2023
3.0.0-beta-0015 152 4/22/2023
3.0.0-beta-0001 251 4/14/2023
3.0.0-alpha-0608 102 4/13/2023
3.0.0-alpha-0604 115 4/13/2023
3.0.0-alpha-0593 185 4/7/2023
3.0.0-alpha-0560 826 3/28/2023
3.0.0-alpha-0557 120 3/27/2023
3.0.0-alpha-0552 127 3/26/2023
3.0.0-alpha-0550 128 3/25/2023
3.0.0-alpha-0548 124 3/25/2023
3.0.0-alpha-0545 129 3/25/2023
3.0.0-alpha-0543 144 3/24/2023
3.0.0-alpha-0540 121 3/24/2023
3.0.0-alpha-0533 4,256 3/14/2023
3.0.0-alpha-0532 128 3/12/2023
3.0.0-alpha-0530 213 3/6/2023
3.0.0-alpha-0523 175 3/1/2023
3.0.0-alpha-0516 140 2/27/2023
3.0.0-alpha-0513 120 2/26/2023
3.0.0-alpha-0497 126 2/23/2023
3.0.0-alpha-0496 620 2/4/2023
3.0.0-alpha-0495 631 1/12/2023
3.0.0-alpha-0491 341 12/24/2022
3.0.0-alpha-0489 144 12/23/2022
3.0.0-alpha-0470 136 12/15/2022
3.0.0-alpha-0427 244 12/4/2022
3.0.0-alpha-0423 141 12/1/2022
3.0.0-alpha-0402 285 11/19/2022
3.0.0-alpha-0399 214 11/12/2022
3.0.0-alpha-0396 132 11/12/2022
3.0.0-alpha-0392 178 10/29/2022
3.0.0-alpha-0391 144 10/27/2022
3.0.0-alpha-0387 292 10/25/2022
3.0.0-alpha-0384 161 10/25/2022
3.0.0-alpha-0376 149 10/7/2022
3.0.0-alpha-0370 146 10/4/2022
3.0.0-alpha-0360 116 10/3/2022
3.0.0-alpha-0354 152 10/1/2022
3.0.0-alpha-0348 169 9/26/2022
3.0.0-alpha-0344 145 9/25/2022
3.0.0-alpha-0343 133 9/24/2022
3.0.0-alpha-0338 140 9/22/2022
3.0.0-alpha-0329 120 9/20/2022
3.0.0-alpha-0310 181 9/3/2022
3.0.0-alpha-0283 142 8/24/2022
3.0.0-alpha-0266 168 8/13/2022
3.0.0-alpha-0245 147 8/10/2022
3.0.0-alpha-0225 165 8/9/2022
3.0.0-alpha-0216 139 8/7/2022
3.0.0-alpha-0208 154 8/5/2022
3.0.0-alpha-0204 132 7/31/2022
3.0.0-alpha-0181 151 7/25/2022
3.0.0-alpha-0172 126 7/22/2022
3.0.0-alpha-0167 164 7/19/2022
3.0.0-alpha-0160 140 7/18/2022
3.0.0-alpha-0158 142 7/18/2022
3.0.0-alpha-0157 150 7/17/2022
3.0.0-alpha-0156 139 7/16/2022
3.0.0-alpha-0155 154 7/15/2022
3.0.0-alpha-0142 129 7/14/2022
3.0.0-alpha-0128 178 6/16/2022
3.0.0-alpha-0102 140 6/6/2022
3.0.0-alpha-0099 142 6/2/2022
3.0.0-alpha-0090 138 5/25/2022
3.0.0-alpha-0087 140 5/24/2022
3.0.0-alpha-0084 139 5/24/2022
3.0.0-alpha-0082 155 5/23/2022
3.0.0-alpha-0079 137 5/21/2022
3.0.0-alpha-0075 154 5/20/2022
1.1.1 7,264 3/3/2022
1.0.0 174 5/27/2023