One of the biggest flaws I wanted to correct with DasBlog Core was that if you updated the underlying configuration file it would take a site restart for the settings to be refreshed. For example if I want to change Theme or the site name, I would need to initiate a site restart. This was clearly untenable. I had also went through the hassle of creating a DasBlog CLI but it was useless without a reset.
So the following is how I originally set this up, I added the xml file using the XmlConfigurationProvider, note that I used the reloadOnChange which I assume uses a FileSystemWatcher and refreshes when the file changes:
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddXmlFile("DasBlogSettings.xml", optional: true, reloadOnChange: true)
…
ASP.NET Core supports dependency injection, which is a technique for achieving Inversion of Control (IoC) between classes and their dependencies, the following code sets that up for me:
public void ConfigureServices(IServiceCollection services)
{
...
services.Configure(Configuration);
services.Configure(Configuration);
...
services
.AddTransient();
}
My DasBlogSettings class uses the options pattern to pull in the settings across my entire site, however, it does not pick up refreshed values:
public class DasBlogSettings : IDasBlogSettings
{
public IMetaTags MetaTags { get; set; }
public ISiteConfig SiteConfiguration { get; set; }
public DasBlogSettings(IOptions siteConfig, IOptions metaTagsConfig)
{
SiteConfiguration = siteConfig.Value;
MetaTags = metaTagsConfig.Value;
}
}
So the following is the corrected code, I use IOptionsMonitor
public class DasBlogSettings : IDasBlogSettings
{
public IMetaTags MetaTags { get; set; }
public ISiteConfig SiteConfiguration { get; set; }
public DasBlogSettings(IOptionsMonitor siteConfig, IOptionsMonitor metaTagsConfig)
{
SiteConfiguration = siteConfig.CurrentValue;
MetaTags = metaTagsConfig.CurrentValue;
}
}
Now I can happily update settings via the site or CLI and immediately see the changes everywhere without downtime. Basic, but still … yay!
Comments are closed.