using CloudBuilder.Core.Extensions; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Options; namespace CloudBuilder.Core.Application.Options { /// /// CloudBuilder配置选项创建器 /// public class CloudBuilderOptionsSetup : IConfigureOptions { private readonly IConfiguration _configuration; /// /// 初始化一个类型的新实例 /// public CloudBuilderOptionsSetup(IConfiguration configuration) { _configuration = configuration; } /// Invoked to configure a TOptions instance. /// The options instance to configure. public void Configure(CloudBuilderOptions options) { SetDbContextOptions(options); IConfigurationSection section; //MailSender section = _configuration.GetSection("CloudBuilder:MailSender"); MailSenderOptions sender = section.Get(); if (sender != null) { if (sender.Password == null) { sender.Password = _configuration["CloudBuilder:MailSender:Password"]; } options.MailSender = sender; } //EnableGlobalAuthorize section = _configuration.GetSection("CloudBuilder:Authorization:EnableGlobalAuthorize"); options.EnableGlobalAuthorize = section.Get(); //JwtOptions section = _configuration.GetSection("CloudBuilder:Jwt"); JwtOptions jwt = section.Get(); if (jwt != null) { if (jwt.Secret == null) { jwt.Secret = _configuration["CloudBuilder:Jwt:Secret"]; } options.Jwt = jwt; } // RedisOptions section = _configuration.GetSection("CloudBuilder:Redis"); RedisOptions redis = section.Get(); if (redis != null) { if (redis.Configuration.IsMissing()) { throw new Exception("配置文件中Redis节点的Configuration不能为空"); } options.Redis = redis; } //// SwaggerOptions //section = _configuration.GetSection("CloudBuilder:Swagger"); //SwaggerOptions swagger = section.Get(); //if (swagger != null) //{ // if (swagger.Url.IsMissing()) // { // throw new CloudBuilderException("配置文件中Swagger节点的Url不能为空"); // } // options.Swagger = swagger; //} } /// /// 初始化上下文配置信息,首先以CloudBuilder配置节点中的为准, /// 不存在CloudBuilder节点,才使用ConnectionStrings的数据连接串来构造SqlServer的配置, /// 保证同一上下文类型只有一个配置节点 /// /// private void SetDbContextOptions(CloudBuilderOptions options) { IConfigurationSection section = _configuration.GetSection("CloudBuilder:DbContexts"); IDictionary dict = section.Get>(); var repeated = dict.Values.GroupBy(m => m.DbContextTypeName).FirstOrDefault(m => m.Count() > 1); if (repeated != null) { throw new Exception($"数据上下文配置中存在多个配置节点指向同一个上下文类型:{repeated.First().DbContextTypeName}"); } foreach (KeyValuePair pair in dict) { options.DbContexts.Add(pair.Key, pair.Value); } } } }