Skip to content

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 methodservices.AddSmtpConfigRoot(configuration)
  • Configuration source methodbuilder.ConfigureSmtpConfigRootSources()

[ConfigModule] generates:

  • SmtpConfigModuleProvider — wraps IOptions<T> for each exposed type
  • IHasSmtpConfigModule — capability interface for runtime constraints
  • Effect accessorSmtpConfigModule.SmtpSettings<RT>()
  • DI extensionservices.AddSmtpConfigModule()

Access configuration in effect compositions via [ConfigModule]:

from settings in SmtpConfigModule.SmtpSettings<AppRuntime>()
let host = settings.Host

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