Reactive Configuration let's you inject strongly typed configuration into your application sourced from one or more Configuration Sources. These sources keep your configuration up-to-date using Observables. If your observed configuration changes the next time you "need" your settings they will be up-to-date, hence Reactive Configuration.
The goal of this library is to be your application's core supplier of static and dynamic configuration management. With dynamic configuration, we can build a lot of nice things on top of this:
- The basics like application and environment settings.
- Feature toggles
- A/B testing
- Service discovery
Currently out of the box we provide:
- JSON configuration source
- Enviornment configuration source
- StructureMap IoC container integration
Lets take a look at using Reactive.Config. To make a configurable type simply add the IConfigurable marker interface to the type.
publicclassMyConfigured:IConfigured{publicboolIsEnabled{get;set;}=true;publicDateTimeEnabledOn{get;set;}=DateTime.UtcNow+TimeSpan.FromDays(-7);publicstringMyAppKey{get;set;}="sooooouuuuuper seeeecrette app key";}Next we'll take a constructor dependency on this configured type in one of our application types.
publicclassMyService{privatereadonlyMyConfigured_config;publicMyService(MyConfiguredconfig){_config=config;}publicvoidDoSomething(){if(!_config.IsEnabled||DateTime.Now<=_config.EnabledOn){return;}//login using my appkeyConsole.WriteLine($"Logging in using AppKey: {_config.MyAppKey}");}}Next, we'll setup our IoC container to use the JSON configuration source.
In this example we use StructureMap. Here we scan the current assembly for types needing reactive configuration.
varcontainer=newContainer(_ =>{_.ReactiveConfig(rc =>{rc.AddSource<JsonConfigurationSource>();});_.Scan(s =>{s.TheCallingAssembly();s.Convention<ReactiveConfig>();});});varservice=container.GetInstance<MyService>()
service.DoSomething();Run this code in a console app and you see this printed out: Logging in using AppKey: sooooouuuuuper seeeecrette app key.
We have not added JSON configuration file to our project. We get no errors just a default instance of the configured type.
Now, let's add this JSON file to your current working directory.
{
"MyAppKey" : "a different app key"
}Run the app again and you see Logging in using AppKey: a different app key.
Open a command line:
git clone https://github.com/KevM/Reactive.Config
cd Reactive.Config
./build.cmd
The build automation will pull down any dependencies, build, and run all tests.
AppVeyor is kind enough to provide CI for this project. Thanks!