--- source_files: - Common/DTS.Common.Core/Config/DTSConfig.cs generated_at: "2026-04-16T02:05:43.907445+00:00" model: "Qwen/Qwen3-Coder-Next-FP8" schema_version: 1 sha256: "2693b2d1a0d0acee" --- # Config ### **1. Purpose** The `DTSConfig` class provides a centralized, thread-safe mechanism for loading and accessing an *alternate* application configuration file (e.g., for plugin-specific or test-specific configs), overriding the default `app.config`/`web.config`. It enables runtime configuration of the config file path via `DTSConfigInit`, then exposes typed accessors (`GetAppSetting`, `GetSection`) to read settings and custom sections from that alternate file using .NET’s `System.Configuration` APIs. This supports scenarios like plugin isolation or environment-specific overrides without modifying the main executable’s config. --- ### **2. Public Interface** - **`static void DTSConfigInit(string path)`** Initializes the alternate configuration by setting the config file path and loading the configuration. Internally calls `SetAltConfigPath(path)`. If `path` is `null` or empty, falls back to `DTSConstants.CustomConfigPath`. Must be called before other config accessors to ensure `AltConfig` is populated. - **`static string GetAppSetting(string key)`** Retrieves the value of an `` entry from the `appSettings` section of the alternate configuration. Returns `string.Empty` if the key is not found. Logs a warning via `APILogger` when the key is absent. - **`static object GetSection(string sectionName)`** Retrieves a custom configuration section (e.g., `
`) by name from the alternate configuration. Returns `null` if the section is not defined. Logs a warning via `APILogger` when the section is absent. - **`static string AltConfigPathGet()`** Thread-safe getter for the current alternate config file path (stored in `AltConfigPath`). Returns the path string (may be `null` or empty if not set or reset). - **`static void AltConfigPathSet(string path)`** Thread-safe setter for the alternate config file path. Updates `AltConfigPath` but *does not reload* the configuration—`SetAltConfigPath` must be called to apply the new path and reinitialize `AltConfig`. --- ### **3. Invariants** - **Thread Safety**: All access to `AltConfigPath` and `AltConfig` is guarded by a private static lock object (`MyLock`). Reads (`AltConfigPathGet`, `GetAltConfig`, `GetAppSetting`, `GetSection`) and writes (`AltConfigPathSet`, `SetAltConfigPath`) are serialized. - **Fallback Behavior**: When `AltConfigPath` is `null` or empty, `SetAltConfigPath` uses `DTSConstants.CustomConfigPath` as the config file path. - **Configuration Loading**: `AltConfig` is lazily initialized on first call to `SetAltConfigPath` (via `DTSConfigInit` or direct invocation) and *not* reloaded automatically on subsequent path changes—`SetAltConfigPath` must be called again to refresh it. - **Error Handling**: Missing keys/sections are *not* thrown as exceptions; instead, they return `string.Empty`/`null` with a log message. No fallback to default config is attempted. --- ### **4. Dependencies** - **Internal Dependencies**: - `DTS.Common.Utilities.Logging.APILogger` — Used for logging missing config entries/sections. - `System.Configuration.ConfigurationManager`, `ExeConfigurationFileMap`, `ConfigurationUserLevel` — For loading and accessing configuration files. - `DTSConstants.CustomConfigPath` — Fallback path when `AltConfigPath` is unset. - **External Dependencies**: - `System.Configuration` assembly (standard .NET Framework/Standard). - No direct runtime dependencies beyond .NET config APIs. - **Depended Upon By**: - Plugin code (per `GetSection`’s XML comment) to access plugin-specific configuration sections. - Any module requiring runtime-configurable settings without modifying the main executable’s config. --- ### **5. Gotchas** - **`AltConfigPathSet` does not reload config**: Calling `AltConfigPathSet` alone updates the stored path but *does not* reinitialize `AltConfig`. The configuration must be reloaded via `SetAltConfigPath` (e.g., `DTSConfigInit`) to apply changes. - **No fallback to main config**: If the alternate config file is missing, invalid, or lacks a requested key/section, the system logs a warning but returns `string.Empty`/`null`—it does *not* fall back to the default `app.config`. - **`DTSConstants.CustomConfigPath` is assumed but not defined here**: The fallback path relies on an external constant (`DTSConstants.CustomConfigPath`). Its value and behavior are not visible in this file. - **Thread-safety only covers state, not config validity**: While access to `AltConfig` is thread-safe, concurrent calls to `SetAltConfigPath` may cause transient inconsistencies (e.g., one thread sets a path while another reads `AltConfig` before reinitialization completes). - **No validation of config file path**: `SetAltConfigPath` does not validate whether the provided path exists or is readable; `ConfigurationManager.OpenMappedExeConfiguration` will throw if the file is inaccessible (e.g., `FileNotFoundException`), but this is not handled internally.