加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

4.2 多级可换源的配置(下)

发布时间:2016-10-29 02:18:16 所属栏目:教程 来源:站长网
导读:副标题#e# 前面已经实现了Json配置源的方式,以及在Startup中注册使用我们的配置源。下面我们进入重点,就是如何实现数据库方式的配置。数据表对应的实体类和DbContext代码如下,就不写数据表的结构了:) 1 public class ConfigurationSectionInfo 2 { 3 pub
副标题[/!--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     }

4.2 多级可换源的配置(下)

接下来就是数据库的配置源类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     }

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读