4.2 多级可换源的配置(下)
副标题[/!--empirenews.page--]
前面已经实现了Json配置源的方式,以及在Startup中注册使用我们的配置源。下面我们进入重点,就是如何实现数据库方式的配置。数据表对应的实体类和DbContext代码如下,就不写数据表的结构了:) 1 public class ConfigurationSectionInfo 2 { 3 public string AppCode { get; set; } 4 public string SectionCode { get; set; } 5 public string SectionName { get; set; } 6 public string SectionString { get; set; } 7 } 8 9 public class ConfigurationContext : DbContext 10 { 11 public ConfigurationContext(DbContextOptions options) : base(options) 12 { 13 } 14 15 public DbSet<ConfigurationSectionInfo> ConfigurationSections { get; set; } 16 17 protected override void OnModelCreating(ModelBuilder modelBuilder) 18 { 19 EntityTypeBuilder<ConfigurationSectionInfo> builder = modelBuilder.Entity<ConfigurationSectionInfo>(); 20 21 builder.ToTable("CONFIGURATION_SECTION_INFO"); 22 builder.Property(c => c.AppCode).HasColumnName("APP_CODE").IsRequired(); 23 builder.Property(c => c.SectionCode).HasColumnName("SECTION_CODE").IsRequired(); 24 builder.Property(c => c.SectionName).HasColumnName("SECTION_NAME").IsRequired(); 25 builder.Property(c => c.SectionString).HasColumnName("SECTION_STRING").IsRequired(); 26 27 builder.HasKey(c => new { c.AppCode, c.SectionCode }); 28 } 29 } 接下来就是数据库的配置源类DatabaseConfigSource,继承我们自己的基类ConfigSource,并实现GetConfigurationRoot方法。 1 [TypeName("Database", "数据库配置")] 2 public class DatabaseConfigSource : ConfigSource 3 { 4 public DatabaseConfigSource(string parameter) : base(parameter) 5 { 6 } 7 8 public override IConfigurationRoot GetConfigurationRoot() 9 { 10 AppConfigInfo config = AppConfigInfo.GetConfig(); 11 12 ConfigurationBuilder builder = new ConfigurationBuilder(); 13 builder.Add(new DbConfigurationSource(options => options.UseSqlServer(_Parameter), config.AppCode)); 14 15 return builder.Build(); 16 } 17 } 需要注意的是AppConfigInfo类,这个类我们用到的是AppCode属性,AppCode是指应用程序代码。因为我们的公共配置可以给多个应用使用,因此数据库方式获取配置时必须传入AppCode。在这里的意思是获取与应用程序(AppCode)相关的配置项。因为配置数据表中可能存在许多个应用的配置信息,我们这里只获取当前应用的配置信息。Parameter参数就是数据库链接串,可以在前面一节ConfigSource类的介绍中明显的看到。 创建ConfigurationBuilder,添加IConfigurationSource的数据库实现--DbConfigurationSource,其核心是DbConfigurationProvider。DbConfigurationSource和DbConfigurationProvider的实现如下: 1 public class DbConfigurationSource : IConfigurationSource 2 { 3 private readonly Action<DbContextOptionsBuilder> _optionsAction; 4 private readonly string appCode; 5 6 public DbConfigurationSource(Action<DbContextOptionsBuilder> optionsAction, string appCode) 7 { 8 _optionsAction = optionsAction; 9 this.appCode = appCode; 10 } 11 12 public IConfigurationProvider Build(IConfigurationBuilder builder) 13 { 14 return new DbConfigurationProvider(_optionsAction, appCode); 15 } 16 } 17 18 public class DbConfigurationProvider : ConfigurationProvider 19 { 20 private Action<DbContextOptionsBuilder> optionsAction; 21 private string appCode; 22 23 public DbConfigurationProvider(Action<DbContextOptionsBuilder> optionsAction, string appCode) 24 { 25 this.optionsAction = optionsAction; 26 this.appCode = appCode; 27 } 28 29 public override void Load() 30 { 31 var builder = new DbContextOptionsBuilder<ConfigurationContext>(); 32 optionsAction(builder); 33 34 using (var dbContext = new ConfigurationContext(builder.Options)) 35 { 36 dbContext.Database.EnsureCreated(); 37 Data = GetConfigData(dbContext); 38 } 39 } 40 41 private IDictionary<string, string> GetConfigData(ConfigurationContext dbContext) 42 { 43 List<string> configSections = new List<string>(); 44 45 var appConfigs = dbContext.ConfigurationSections.Where(a => a.AppCode == this.appCode); 46 foreach (ConfigurationSectionInfo info in appConfigs) 47 { 48 configSections.Add(""" + info.SectionCode + "":{" + info.SectionString + "}"); 49 } 50 51 var defConfigs = dbContext.ConfigurationSections.Where(d => string.IsNullOrEmpty(d.AppCode) && appConfigs.Any(a => a.SectionCode == d.SectionCode)); 52 foreach (ConfigurationSectionInfo info in defConfigs) 53 { 54 configSections.Add(""" + info.SectionCode + "":{" + info.SectionString + "}"); 55 } 56 57 string configs = "{"MicroStrutLibrary":{" + string.Join(",", configSections) + "}}"; 58 59 return JsonConfigurationParser.Parse(configs); 60 } 61 } (编辑:成都站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |