C#上位机配置信息加载功能
最开始的加载方式是用了一个全局类,里面存了各种的静态变量,在程序打开后会读取文件里的数据,存入全局静态变量里,需要的时候调用,修改配置的时候再重新写入文件。旧项目中是这样实现的,并且读取还是用了一个循环,存入了中间数组变量里。经常出现的问题呢,就是过程太过于繁琐,不仅修改的时候要时刻牢记整个流程,一个参数的增加各处都要修改,遗忘一处就要出bug,还有读取文件时候的参数计数也经常忘记修改会少读变量。总之这种方式又繁琐又容易出错。
int ia = 0;
string line;
using (StreamReader sr = new StreamReader(Application.StartupPath + "\\系统配置\\" + "通讯配置.dat"))
{
for (ia = 1; ia <= 16; ia++)
{
line = sr.ReadLine();
Library.Setting1[ia] = Convert.ToString(line);
}
}
Configure1.Text = Convert.ToString(Library.Setting1[1]); //接口
Configure2.Text = Convert.ToString(Library.Setting1[2]);//plcIP
Configure3.Text = Convert.ToString(Library.Setting1[3]);//PlcPort
....
于是我开始使用了Ini文件来存储变量,虽然也是全局静态变量,但是至少在修改的时候不用去记住参数的总数再写入配置文件。另外我把所有的读取和写入的方法新建到一个配置信息管理的类里,里面存储着全局静态变量,还有下面这些方法。不过到此,在配置信息窗口来还需要在存入文件前把数据存入到全局变量里,读取时也是要赋值给全局静态变量。
ReadIni _ini = new ReadIni(Application.StartupPath + "//config.ini");
_ini.WriteValue("MES", "URL", MesUrl);
_ini.WriteValue("MES", "进站API", InputAPI);
_ini.WriteValue("MES", "出站API", OutputAPI);
_ini.WriteValue("MES", "设备状态API", DeviceAPI);
_ini.WriteValue("MES", "设备编号", AssetNumber);
_ini.WriteValue("MES", "产线编号", WorkCenterName);
_ini.WriteValue("MES", "工序名称", SpecificationName);
_ini.WriteValue("PLC", "IP", PLCIP);//PLC
_ini.WriteValue("PLC", "PORT", PLCPort);//PLC
_ini.WriteValue("Local", "netName", netDeviceName);//PLC
最后就有了使用属性的这一方法。依旧是使用ini文件来存储参数,但使用属性在进行赋值和文件存入操作,变量_url对其他类不可见,只能使用属性Url来间接获取其数据,在第一次获取数据的时候会去判断是否为空,如果为空就去读取文件,适合第一次加载参数,后续都只读取内存中的数值。在设置变量的值时同时也会存入文件并且赋值_url。另外为了防止多个线程去设置值的时候同时读取文件导致异常,添加文件锁避免同时写。
private static string _url;
public static string Url
{
get => _url ?? (_url = Ini.ReadValue("MES", "上传接口")); //统一上传url
set
{
lock (IniFileLock)
{
_url = value;
Ini.WriteValue("MES", "上传接口", value);
}
}
}