Files
FSI.BT.IR.Tools/Config.Net/ConfigurationBuilder.cs
Stephan Maier 647f938eee v1.2
2024-08-27 08:10:27 +02:00

73 lines
2.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;
using Castle.DynamicProxy;
using Config.Net.Core;
namespace Config.Net
{
public class ConfigurationBuilder<T> where T : class
{
private readonly ProxyGenerator _generator = new ProxyGenerator();
private List<IConfigStore> _stores = new List<IConfigStore>();
private TimeSpan _cacheInterval = TimeSpan.Zero;
private readonly List<ITypeParser> _customParsers = new List<ITypeParser>();
public ConfigurationBuilder()
{
TypeInfo ti = typeof(T).GetTypeInfo();
if (!ti.IsInterface) throw new ArgumentException($"{ti.FullName} must be an interface", ti.FullName);
}
/// <summary>
/// Creates an instance of the configuration interface
/// </summary>
/// <returns></returns>
public T Build()
{
var valueHandler = new ValueHandler(_customParsers);
var ioHandler = new IoHandler(_stores, valueHandler, _cacheInterval);
T instance = _generator.CreateInterfaceProxyWithoutTarget<T>(new InterfaceInterceptor(typeof(T), ioHandler));
return instance;
}
/// <summary>
/// Set to anything different from <see cref="TimeSpan.Zero"/> to add caching for values. By default
/// Config.Net doesn't cache any values
/// </summary>
/// <param name="time"></param>
/// <returns></returns>
public ConfigurationBuilder<T> CacheFor(TimeSpan time)
{
_cacheInterval = time;
return this;
}
public ConfigurationBuilder<T> UseConfigStore(IConfigStore store)
{
_stores.Add(store);
return this;
}
/// <summary>
/// Adds a custom type parser
/// </summary>
public ConfigurationBuilder<T> UseTypeParser(ITypeParser parser)
{
if (parser == null)
{
throw new ArgumentNullException(nameof(parser));
}
_customParsers.Add(parser);
return this;
}
}
}