Skip to content

Properties Configuration Source ​

Properties is a key-value configuration file format widely used in the Java ecosystem and supported by many other applications.

Installation ​

bash
dotnet add package Apq.Cfg.Properties

Default Level ​

This configuration source has a default level of CfgSourceLevels.Properties (0).

If the level parameter is not specified, the default level is used:

csharp
// Use default level 0
.AddPropertiesFile("config.properties")

// Specify custom level
.AddPropertiesFile("config.properties", level: 5)

Basic Usage ​

csharp
using Apq.Cfg;
using Apq.Cfg.Properties;

var cfg = new CfgBuilder()
    .AddPropertiesFile("config.properties")  // Use default level 0
    .Build();

Optional Files and Reload ​

csharp
var cfg = new CfgBuilder()
    .AddPropertiesFile("config.properties", reloadOnChange: true)
    .AddPropertiesFile("config.local.properties", level: 1, optional: true, reloadOnChange: true)
    .Build();

Writable Configuration ​

csharp
var cfg = new CfgBuilder()
    .AddPropertiesFile("config.properties", writeable: true, isPrimaryWriter: true)
    .Build();

// Modify configuration
cfg["App:Name"] = "NewName";
await cfg.SaveAsync();

Method Signature ​

csharp
public static CfgBuilder AddPropertiesFile(
    this CfgBuilder builder,
    string path,
    int level,
    bool writeable = false,
    bool optional = true,
    bool reloadOnChange = true,
    bool isPrimaryWriter = false)

Parameter Description ​

ParameterDescription
pathProperties file path
levelConfiguration level, higher values have higher priority
writeableWhether writable (default false)
optionalWhether to ignore if file doesn't exist (default true)
reloadOnChangeWhether to automatically reload on file change (default true)
isPrimaryWriterWhether this is the default write target (default false)

Properties File Format ​

Basic Structure ​

properties
# This is a comment
App.Name=MyApp
App.Version=1.0.0
Database.Host=localhost
Database.Port=5432
Database.Name=mydb
Database.Username=admin
Database.Password=secret
Logging.Level=INFO
Logging.EnableConsole=true

Dot-separated Namespaces ​

properties
# Use dots to separate namespaces
app.name=MyApp
app.database.host=localhost
app.database.port=5432
app.logging.level=INFO

Using Equals or Colon ​

properties
# Use equals
key1=value1

# Use colon
key2:value2

Escape Characters ​

properties
# Newline
description=Line1\nLine2

# Tab
tabbed=value1\tvalue2

# Special character escaping
hash_comment=This is not a comment \#here
colon_value=key\:value
backslash=path\\to\\file

Multi-line Values ​

properties
# Use backslash for continuation
long_value=This is a very long value that \
          continues on the next line

Key Path Mapping ​

Properties structure maps to colon-separated key paths:

Properties KeyConfiguration Key
App.NameApp:Name
Database.HostDatabase:Host
Database.Connection.TimeoutDatabase:Connection:Timeout

Advanced Options ​

Specify Encoding ​

csharp
var options = new EncodingOptions
{
    ReadStrategy = EncodingReadStrategy.Specified,
    ReadEncoding = Encoding.UTF8
};

var cfg = new CfgBuilder()
    .AddPropertiesFile("config.properties", encoding: options)
    .Build();

Section Support (INI-style) ​

properties
# Sections use square brackets
[app]
name=MyApp
version=1.0.0

[database]
host=localhost
port=5432

[logging]
level=INFO

When reading, sections act as prefixes:

Properties KeyConfiguration Key
app.name (no section)app.name
name under [app]app:name
host under [database]database:host

Mix with Other Formats ​

csharp
var cfg = new CfgBuilder()
    .AddJsonFile("config.json")
    .AddPropertiesFile("config.properties", level: 1, optional: true)
    .AddEnvironmentVariables(prefix: "APP_")
    .Build();

Use Cases ​

  • Java/Spring projects (Properties is Spring's default format)
  • Sharing configuration with legacy Java applications
  • Simple key-value configuration needs
  • Consistency with system properties (System.getProperty)
  • Simple format for cross-language configuration sharing

Spring Framework Integration ​

Spring Boot's application.properties files can be used directly:

properties
# Spring Boot application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=admin
spring.datasource.password=secret
server.port=8080

Use in Apq.Cfg:

csharp
var cfg = new CfgBuilder()
    .AddPropertiesFile("application.properties")
    .Build();

// Access configuration
var dbUrl = cfg["spring:datasource:url"];
var port = cfg.GetValue<int>("server:port");

Dependencies ​

No additional dependencies (uses .NET built-in Properties format parsing).

Next Steps ​

Released under the MIT License