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 WIDESEA_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; 
 | 
        } 
 | 
    } 
 | 
} 
 |