using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace WIDESEAWCS_Core.Core { public static class ConfigurableOptions { /// <summary>æ·»åŠ é€‰é¡¹é…ç½®</summary> /// <typeparam name="TOptions">选项类型</typeparam> /// <param name="services">æœåС集åˆ</param> /// <returns>æœåС集åˆ</returns> public static IServiceCollection AddConfigurableOptions<TOptions>(this IServiceCollection services) where TOptions : class, IConfigurableOptions { Type optionsType = typeof(TOptions); string path = GetConfigurationPath(optionsType); services.Configure<TOptions>(App.Configuration.GetSection(path)); return services; } public static IServiceCollection AddConfigurableOptions(this IServiceCollection services, Type type) { string path = GetConfigurationPath(type); var config = App.Configuration.GetSection(path); Type iOptionsChangeTokenSource = typeof(IOptionsChangeTokenSource<>); Type iConfigureOptions = typeof(IConfigureOptions<>); Type configurationChangeTokenSource = typeof(ConfigurationChangeTokenSource<>); Type namedConfigureFromConfigurationOptions = typeof(NamedConfigureFromConfigurationOptions<>); iOptionsChangeTokenSource = iOptionsChangeTokenSource.MakeGenericType(type); iConfigureOptions = iConfigureOptions.MakeGenericType(type); configurationChangeTokenSource = configurationChangeTokenSource.MakeGenericType(type); namedConfigureFromConfigurationOptions = namedConfigureFromConfigurationOptions.MakeGenericType(type); services.AddOptions(); services.AddSingleton(iOptionsChangeTokenSource, Activator.CreateInstance(configurationChangeTokenSource, Options.DefaultName, config) ?? throw new InvalidOperationException()); return services.AddSingleton(iConfigureOptions, Activator.CreateInstance(namedConfigureFromConfigurationOptions, Options.DefaultName, config) ?? throw new InvalidOperationException()); } /// <summary>获å–é…置路径</summary> /// <param name="optionsType">选项类型</param> /// <returns></returns> public static string GetConfigurationPath(Type optionsType) { var endPath = new[] { "Option", "Options" }; var configurationPath = optionsType.Name; foreach (var s in endPath) { if (configurationPath.EndsWith(s)) { return configurationPath[..^s.Length]; } } return configurationPath; } } }