Configuration Module¶
The Configuration module has two complementary concerns:
[ConfigRoot]— host-level, generates strongly-typed configuration providers with interfaces, DI registration, JSON Schema output, and secrets management. This is where config files (schema, settings, secrets) are generated.[ConfigModule]— context-level, provides typed config access via runtime effects. Use this to compose configuration into effect pipelines with compile-time capability constraints.
Quick Start¶
using Deepstaging.Config;
// Define config types
public sealed record SmtpSettings(string Host, int Port);
public class SmtpSecrets
{
[Secret]
public string Password { get; init; } = "";
}
// Host-level: ConfigRoot generates config files, schema, DI registration
[ConfigRoot(Section = "Smtp")]
[Exposes<SmtpSettings>]
[Exposes<SmtpSecrets>]
public sealed partial class SmtpConfigRoot;
// Context-level: ConfigModule provides effect-based config access
[ConfigModule]
[Exposes<SmtpSettings>]
public static partial class SmtpConfigModule;
[ConfigRoot] generates:
ISmtpConfigRoot— interface exposing the configuration properties- Partial class implementation — binds properties from
IConfiguration["Smtp"] - DI extension method —
services.AddSmtpConfigRoot(configuration) - Configuration source method —
builder.ConfigureSmtpConfigRootSources()
[ConfigModule] generates:
SmtpConfigModuleProvider— wrapsIOptions<T>for each exposed typeIHasSmtpConfigModule— capability interface for runtime constraints- Effect accessor —
SmtpConfigModule.SmtpSettings<RT>() - DI extension —
services.AddSmtpConfigModule()
Access configuration in effect compositions via [ConfigModule]:
Sub-pages¶
| Page | Description |
|---|---|
| Attributes | [ConfigRoot], [ConfigModule], [Exposes<T>], [ConfigSection], [Secret] |
| Generated Code | Interface, partial class, DI extension, configuration files, JSON Schema |
| Effects Composition | [ConfigModule], [Capability], [Runtime], [Uses], effect-wrapped access, OpenTelemetry |
| Secrets | [Secret] attribute, schema separation, User Secrets integration |
Diagnostics¶
| ID | Severity | Description | Code Fix |
|---|---|---|---|
| DSCFG01 | Error | ConfigRoot class must be partial |
Add partial modifier |
| DSCFG02 | Warning | ConfigRoot class should be sealed |
Add sealed modifier |
| DSCFG03 | Error | Section name could not be inferred | — |
| DSCFG04 | Warning | Exposed type has no public instance properties | — |
| DSCFG05 | Warning | Property appears to contain secrets | Add [Secret] attribute |
| DSCFG06 | Info/Warning | Configuration files missing or out of date | Generate configuration files |
| DSCFG07 | Error | [Secret] properties exist but no UserSecretsId |
Add <UserSecretsId> to project |
| DSCFG09 | Info | [Secret] properties exist — secrets can be synced |
Run deepstaging.secrets-update.sh |
| DSCFG10 | Info | Infrastructure config section available | Add [Exposes<T>] attribute |
| DSCFG11 | Error | ConfigModule class must be partial |
Add partial modifier |
| DSCFG12 | Error | ConfigModule class must be static |
Add static modifier |