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