Crip.Extensions.ConfigLocator
1.4.0
dotnet add package Crip.Extensions.ConfigLocator --version 1.4.0
NuGet\Install-Package Crip.Extensions.ConfigLocator -Version 1.4.0
<PackageReference Include="Crip.Extensions.ConfigLocator" Version="1.4.0" />
<PackageVersion Include="Crip.Extensions.ConfigLocator" Version="1.4.0" />
<PackageReference Include="Crip.Extensions.ConfigLocator" />
paket add Crip.Extensions.ConfigLocator --version 1.4.0
#r "nuget: Crip.Extensions.ConfigLocator, 1.4.0"
#:package Crip.Extensions.ConfigLocator@1.4.0
#addin nuget:?package=Crip.Extensions.ConfigLocator&version=1.4.0
#tool nuget:?package=Crip.Extensions.ConfigLocator&version=1.4.0
ConfigLocator
Crip.Extensions.ConfigLocator helps ASP.NET Core apps register options classes automatically.
Instead of writing services.Configure<TOptions>(...) for every class, mark your options with an attribute and let the library do the wiring.
What it does
- Finds options classes in your assemblies
- Binds them to configuration sections
- Supports validation
- Can bind more than one type from the same section
Quick start
Install the package:
dotnet add package Crip.Extensions.ConfigLocator
Register it in Program.cs:
using Crip.Extensions.ConfigLocator;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddConfigLocator(builder.Configuration);
Define an options class
using Crip.Extensions.ConfigLocator;
[ConfigLocation("ExternalServices:GitHub")]
public class GitHubOptions
{
public string ApiKey { get; set; } = string.Empty;
public int TimeoutSeconds { get; set; } = 30;
}
This maps to appsettings.json:
{
"ExternalServices": {
"GitHub": {
"ApiKey": "your-api-key",
"TimeoutSeconds": 60
}
}
}
Use it like any other ASP.NET Core options class:
public class GitHubService(IOptions<GitHubOptions> options)
{
private readonly GitHubOptions _options = options.Value;
public void DoSomething() => Console.WriteLine(_options.ApiKey);
}
Validation
You can use standard data annotations or a custom validator.
Data annotations
[ConfigLocation("MySection")]
[ConfigValidate]
public class MyOptions
{
[Required, MinLength(5)]
public string ApiKey { get; set; } = null!;
}
Custom validator
public class MyOptionsValidator : IValidateOptions<MyOptions>
{
public ValidateOptionsResult Validate(string? name, MyOptions options)
{
if (options.ApiKey == "default")
return ValidateOptionsResult.Fail("API Key cannot be 'default'");
return ValidateOptionsResult.Success;
}
}
[ConfigLocation("MySection")]
[ConfigValidate<MyOptionsValidator>]
public class MyOptions
{
public string ApiKey { get; set; } = null!;
}
// For older C# versions, use:
// [ConfigValidate(typeof(MyOptionsValidator))]
More than one type
You can bind multiple types to the same section:
[ConfigLocation("ServiceSettings", typeof(AdditionalOptions))]
public class MainOptions
{
// ...
}
Named options
You can register the same options class more than once by giving each registration a name:
[ConfigLocation("GitHub:Default")]
[ConfigLocation("GitHub:Tenants:Europe", "europe")]
[ConfigLocation("GitHub:Tenants:Us", "us")]
public class GitHubOptions
{
public string ApiKey { get; set; } = string.Empty;
}
Then resolve a specific named instance:
public class GitHubClient(IOptionsMonitor<GitHubOptions> options)
{
private readonly GitHubOptions _europe = options.Get("europe");
private readonly GitHubOptions _us = options.Get("us");
}
Limitations
- Only non-abstract classes are scanned
- Binding requires a public parameterless constructor
More info
| Product | Versions 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-ios was computed. net6.0-maccatalyst was computed. 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 is compatible. 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. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.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. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.11)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 10.0.11)
- Microsoft.Extensions.Options.DataAnnotations (>= 10.0.11)
-
net10.0
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.11)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 10.0.11)
- Microsoft.Extensions.Options.DataAnnotations (>= 10.0.11)
-
net8.0
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.11)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 10.0.11)
- Microsoft.Extensions.Options.DataAnnotations (>= 10.0.11)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.