<commit_before>---
layout:     post
title:      "可视化管理各种配置"
subtitle:   "解决.NET项目配置文件种配置多、乱、杂的问题."
date:       2015-10-21 16:00:00
author:     "极品拖拉机"
header-img: "img/post-bg-01.jpg"
tags:
    - .net
---

在开发.NET项目时，特别是web项目，经常通过配置文件设置各种变量，数据库连接字符串等，常用的做法是放到web.config中。但项目大了，配置越来越多，发现web.config配置越来越大，并且有可能几个项目，都有同样的配置，但只能在各自的web.config配置，这样一个容易配错，而且要做重复工作，也有可能这个项目配置了，但另外一个项目漏掉了，发现上线后出错了。

为了偷懒，我采用了一个简单的思路，全局统一管理配置，把配置存储到数据库，然后项目在启动的时候，先从数据库读取到本地内存中，然后每次读取配置，都直接从内存中读取。

## 基础表结构
### 环境表

```csharp

/// <summary>
/// 这个表的意义就类似于sandbox的概念。
/// 每个环境都可以有自己的配置值，如果当前环境没有找到对应的配置，则找到其父节环境的配置。
/// 子环境的配置覆盖父级配置。
/// </summary>
public class Env
{
    public int Id {get; set;}
    public string Name {get; set;}
    public int? ParentId {get; set;}
}
```

### 服务器表

```csharp

/// <summary>
/// 此表记录所有的服务器。
/// </summary>
public class Server
{
    public int Id {get; set;}
    //电脑的名称
    public string ComputerName {get; set;}
    //所属环境
    public int EnvId {get; set;}
    //内网IP
    public string IntranetIP {get; set;}
    //外网IP
    public string IP {get; set;}
    public string Remark {get; set;}
}
```

### 键值配置表

```csharp

  /// <summary>
  /// 对应web.config的AppSetting, 健值配置
  /// </summary>
  public class ConfigValue
  {
      public int Id {get; set;}
      //健名称，一般是namespace.key
      public string Key {get; set;}
      //对应的值
      public string Value {get; set;}
      ///有时候一台服务器，存在好几个项目.
      ///但同一个配置，单独的项目也不一样，就根据web.config的appcode来读取
      public int? AppCode {get; set;}
      //是否启用
      public bool IsActived {get; set;}
      public string Remark {get; set;}
  }
```

### 数据库连接表

```csharp

/// <summary>
/// 对应web.config的ConnectionString, 记录各个数据库的连接字符串
/// </summary><commit_msg>修改博客的代码样式<commit_after>---
layout:     post
title:      "可视化管理各种配置"
subtitle:   "解决.NET项目配置文件种配置多、乱、杂的问题."
date:       2015-10-21 16:00:00
author:     "极品拖拉机"
header-img: "img/post-bg-01.jpg"
tags:
    - .net
---

在开发.NET项目时，特别是web项目，经常通过配置文件设置各种变量，数据库连接字符串等，常用的做法是放到web.config中。但项目大了，配置越来越多，发现web.config配置越来越大，并且有可能几个项目，都有同样的配置，但只能在各自的web.config配置，这样一个容易配错，而且要做重复工作，也有可能这个项目配置了，但另外一个项目漏掉了，发现上线后出错了。

为了偷懒，我采用了一个简单的思路，全局统一管理配置，把配置存储到数据库，然后项目在启动的时候，先从数据库读取到本地内存中，然后每次读取配置，都直接从内存中读取。

## 基础表结构
### 环境表

```

/// <summary>
/// 这个表的意义就类似于sandbox的概念。
/// 每个环境都可以有自己的配置值，如果当前环境没有找到对应的配置，则找到其父节环境的配置。
/// 子环境的配置覆盖父级配置。
/// </summary>
public class Env
{
    public int Id {get; set;}
    public string Name {get; set;}
    public int? ParentId {get; set;}
}
```

### 服务器表

```

/// <summary>
/// 此表记录所有的服务器。
/// </summary>
public class Server
{
    public int Id {get; set;}
    //电脑的名称
    public string ComputerName {get; set;}
    //所属环境
    public int EnvId {get; set;}
    //内网IP
    public string IntranetIP {get; set;}
    //外网IP
    public string IP {get; set;}
    public string Remark {get; set;}
}
```

### 键值配置表

```

  /// <summary>
  /// 对应web.config的AppSetting, 健值配置
  /// </summary>
  public class ConfigValue
  {
      public int Id {get; set;}
      //健名称，一般是namespace.key
      public string Key {get; set;}
      //对应的值
      public string Value {get; set;}
      ///有时候一台服务器，存在好几个项目.
      ///但同一个配置，单独的项目也不一样，就根据web.config的appcode来读取
      public int? AppCode {get; set;}
      //是否启用
      public bool IsActived {get; set;}
      public string Remark {get; set;}
  }
```

### 数据库连接表

```csharp

/// <summary>
/// 对应web.config的ConnectionString, 记录各个数据库的连接字符串
/// </summary>
{'fraction_non_alphanumeric': 0.15842167255594816, 'fraction_numerical': 0.009422850412249705, 'mean_word_length': 2.9824150058616645, 'pattern_counts': {'":': 0, '<': 19, '<?xml version=': 0, '>': 19, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2133461', 'n_tokens_mistral': 1843, 'n_tokens_neox': 2020, 'n_words': 268}