子曰:“工欲善其事,必先利其器
github地址:https://github.com/redAntCpp/CSharpTools
为什么要使用配置类?
在项目开发中,有许多需要用到的参数,是需要进行配置的。当然在开发的时候我们可以先写死,到了需要的时候再进行配置。我个人比较倾向于一开始使用配置。
一般配置什么?
根据项目来,通常比较多的是,配置项目的日志等级、数据库连接字段、接口地址的配置、证书地址的配置等,这样可以在不改变代码的前提下,做到更新。灵活性强。
配置类通常包括,配置接口,配置接口实现。
如何实现配置类
接下来分享个人的配置类实现。(博主使用VS2019)。
在项目右键,新建文件夹,命名为Config,在文件夹右键,新增项目,选择接口类,命名为IConfig.cs。
按照上述的做法,再新建一个类,命名为HOTConfig.cs(HOT是我当时做的一个项目,现在随便取名即可)。
此时,文件夹有两个文件,一个为I开头表示接口类,里面只负责定义功能,而HOTConfig继承于IConfig,需要实现接口的所有功能。
代码展示
以配置数据库跟日志的配置为例,Iconfig.cs 可以简单这么写:
namespace HOT.Config
{
//公共配置接口
public interface IConfig
{
//=======【日志配置】===================================
/* 日志等级,0.不输出日志;1.只输出错误信息; 2.输出错误和正常信息; 3.输出错误信息、正常信息和调试信息
配置日志存放目录、日志名称
*/
int GetLogLevel();
string GetLogPath();
string GetLogName();
//=========【数据库配置】===============================
/*sql server数据库设计(ado.net)*/
string GetHIS_OPConnetionString();
string GetGetDataConnetionString();
string GetHOTConnetionString();
}
}
在HOTConfig.cs中可以这样实现:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace HOT.Config
{
//生成配置类
public class HOTConfig
{
private static volatile IConfig config;
private static object syncRoot = new object();
public static IConfig GetConfig()
{
if (config == null)
{
lock (syncRoot)
{
if (config == null)
config = new Config();
}
}
return config;
}
}
//具体配置项
public class Config : IConfig
{
public Config()
{
}
//=======【日志配置】===================================
/* 日志等级,0.不输出日志;1.只输出错误信息; 2.输出错误和正常信息; 3.输出错误信息、正常信息和调试信息
4.输出所有信息
配置日志存放目录、日志名称
*/
public int GetLogLevel()
{
return 4;
}
//日志存放位置
public string GetLogPath()
{
return @"D:\HOTLog";
}
//日志文本的信息
public string GetLogName()
{
return "HOT";
}
//=========【数据库配置】===============================
/*sql server数据库设计(ado.net)*/
public string GetGetDataConnetionString()
{
//配置
string DataSource = "192.168.x.x";
string InitialCatalog = "GetData";
string UserID = "x";
string Password = "x";
//组装
string ConnetionString = $"Data Source = {DataSource};"
+ $"Initial Catalog = {InitialCatalog};"
+ $"User ID = {UserID};"
+ $"Password = {Password};";
return ConnetionString;
}
public string GetHIS_OPConnetionString()
{
//配置
string DataSource = "192.168.x.x";
string InitialCatalog = "OP";
string UserID = "x";
string Password = "x";
//组装
string ConnetionString = $"Data Source = {DataSource};"
+ $"Initial Catalog = {InitialCatalog};"
+ $"User ID = {UserID};"
+ $"Password = {Password};";
return ConnetionString;
}
public string GetHOTConnetionString()
{
//配置
string DataSource = "192.168.x.x";
string InitialCatalog = "x";
string UserID = "x";
string Password = "x";
//组装
string ConnetionString = $"Data Source = {DataSource};"
+ $"Initial Catalog = {InitialCatalog};"
+ $"User ID = {UserID};"
+ $"Password = {Password};";
return ConnetionString;
}
}
}
实战应用
我们如果是按上述的做法,我们可以只改动上述的文件,即可在所有引用此类的文件中替换。实际上,一些常变动但是又不涉及重要信息的值得设置还可以通过外部文件配置来读取(如xml、json)。如下示例:
在同项目下新增一个json文件,命名为HOTApiConfig.Json:
{
"LogConfig": {
"LogLevel": 4,
"LogName": "HOTApi",
"LogPath": "G:\\C#WorkSpace\\HOTApi\\bin"
}
}
在HOTConfig文件中,读取里面的内容,这样就可以不打开项目的前提下修改配置:
- 首先下载json帮助类:
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
- 修改构造函数
private JObject ConfigJson;
public Config()
{
try
{
//读取json,这个是目前在服务器上配置的,用的相对路径,也可以是绝对路径
string HOTConfigPath = HostingEnvironment.MapPath(@"/HOTApiConfig.Json");
// Log.AddTrack("读取配置文件的路径:HOTConfigPath:", HOTConfigPath);
using (StreamReader file = System.IO.File.OpenText(HOTConfigPath))
{
using (JsonTextReader reader = new JsonTextReader(file))
{
JObject o = (JObject)JToken.ReadFrom(reader);
//Log.AddTrack("读取配置文件:HOTConfig:", o.ToString());
ConfigJson = o;
}
}
}
catch(Exception e)
{
throw e;
}
}
- 读取json文件的值,用来设置配置日志等级。
//=======【日志配置】===================================
/* 日志等级,0.不输出日志;1.只输出错误信息; 2.输出错误和正常信息; 3.输出错误信息、正常信息和调试信息
配置日志存放目录、日志名称
*/
public int GetLogLevel()
{
int i = Convert.ToInt32(ConfigJson["LogConfig"]["LogLevel"]);
return i;
// return 4;
}
public string GetLogPath()
{
return ConfigJson["LogConfig"]["LogPath"].ToString();
// return "D:\\API\\HOTApi";
}
public string GetLogName()
{
return ConfigJson["LogConfig"]["LogName"].ToString();//LogName
//return "HOTApi";
}
我在我的webapi中使用了这种配置方式