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 }
(编辑:宣城站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


