QBO3 provides many configuration classes and corresponding files as part of a standard install. These configuration classes are configured to merge configuration data from their corresponding configuration file with configuration data stored in a SQL 'ConfigurationEntry' table. The BaseConfiguration class provides the ability to monitor this ConfigurationEntry table on a time, allowing site owners to push real-time configuration updates to all servers participating in a server farm.

The key components involved with this include:
  • qbo.Application.ConfigurationEntry: a class file that manages interaction with the ConfigurationEntry table
  • qbo.Application.Configuration.BaseConfiguration: a class that can apply ConfigurationEntry changes in real time
  • qbo.Application.Configuration.BaseConfiguration<T>: a generic class that handles loading and caching of configuration sections
  • qbo.ApplicationWeb.ConfigurationMonitor: a class that polls the ConfigurationEntry table for changes, calling BaseConfiguration.Monitor with any changes found
This is how it works:
  • ConfigurationMonitor calls ConfigurationEntry.Monitor() on a timer
  • ConfigurationEntry.Monitor calls BaseConfiguration.Monitor()
  • BaseConfiguration.Monitor matches the ConfigurationEntry.Source to a configuration section in memory, and if found, calls BaseConfiguration.Update()
    • BaseConfiguration<T>.Load will 'register' a configuration section with BaseConfiguration.RegisteredConfigs as it loads
  • BaseConfiguration.Update is overridden by derived classes, and process the ConfigurationEntry item passed to it

Using BaseConfiguration<T> and DbConfigurationElementCollection

Generally, custom configuration classes in QBO3 follow this pattern:
  • {Handler}Configuration.cs: this handles the entire configuration section
    • this should derive from BaseConfiguration<{Handler}Configuration>
    • e.g. FileObjectConfiguration: BaseConfiguration<FileObjectConfiguration>
    • e.g. CacheConfiguration: BaseConfiguration<CacheConfiguration>
  • {HandlerProperty}Collection.cs: this handles repeating properties (e.g. DbStatements, FileObjects, Queues)
    • this should derive from DbConfigurationElementCollection; this will load custom entries in the collection from the ConfigurationEntry table
  • {HandlerProperty}.cs: this handle a custom properties
When creating a class based on BaseConfiguration<T>, ensure you:
  • override the Update method to handle your class-specific properties
    • this will accept new ConfigurationEntry items, and update the appropriate configuration property in memory
  • create a new SectionName, to establish the default section name for your class
  • override the Initialize method, if your class needs to execute post-load processing to be ready for use
For examples, see:
  • qbo.Application.Configuration.CacheConfiguration
  • qbo.Attachment.Configuration.FileObjectConfiguration