应用的配置

        在这个配置盛行的年代,一个稍大规模的应用或者服务没有配置文件,简直难以想象。就从这一点出发,整个设计的可扩展性就没那么好,基本可以断定这是设计缺陷。又开始胡说,每天都从自己当前认知的极限开始胡说。依次解释以下几个问题。

  • 什么是配置

        配置就是你业务逻辑里的“hard code”,但是这种 hard code 回受业务场景、条件等因素需要,可能改来改去,以满足不同情况的需要。如果把 hard code 写入业务逻辑,那业务的每次调整都会伴随着服务的重新部署,应用的编译打包,消耗太大。所以把这部分 hard code 单独拉出来,不依赖业务逻辑,统一由用户或者供应商统一管理。

  • 为什么要有配置

        如果你看了什么事配置,应该就知道为什么要有配置。物以类聚,人以群分,不是一类人,别往一块凑。大的分类是,业务是业务,配置是配置。业务会包逻辑和运算在里面,配置就是没有逻辑和运算的一些相对固定的信息。


  • 几种常见的配置

        但说Windows , 其他平台(Linux/Unix/Mac)不熟。Linux 平台的服务更是以来配置,不同的语言有不同的支持。API不详细讲解,看一下官网或者百度一下,谷歌一下,病一下都可以找到。只说几点困惑的地方,

        

配置文件路径:

//1. 获取Debug或Release所在的路径
CString CCtMediaSvrConfigDlg::GetModuleDir()
{
	HMODULE module = GetModuleHandle(0);
	TCHAR pFileName[MAX_PATH];
	GetModuleFileName(module, pFileName, MAX_PATH);

	CString csFullPath(pFileName);
	int nPos = csFullPath.ReverseFind(_T('\\'));
	if (nPos < 0)
		return CString("");
	else
		return csFullPath.Left(nPos);
}

CString CCtMediaSvrConfigDlg::GetAbsolutePath(LPCTSTR lpPath)
{
	CString str(lpPath);
	CString strPath = GetModuleDir();
	strPath = strPath + "\\" + str;

	return strPath;
}

创建配置文件<config.ini>, 格式如下

[camera]
ip=172.1.1.1
port=8000
user=admin
pwd=135789

[install]
win32=\driver\Win32\MSI\USBDrv-install.bat
x64=\driver\X64\MSI\USBDrv-install.bat

[uninstall]
win32=\driver\Win32\MSI\USBDrv-uninstall.bat
x64=\driver\X64\MSI\USBDrv-uninstall.bat

[autorun]
start=1

[filesvr]
url=http://timing.1qj.com/Api/uploadInfoImage

注意:配置文件中不区分数字还是字符串,都不需要带引号。在使用WINAPI 读取配置信息的时候,需要读数字的按照读数字的方式读入,需要读字符串的按照字符串方式读入。需要更新配置的时候,程序里统一举例如下,

简单的读写:

LPTSTR lpValue = new TCHAR[100];
	GetPrivateProfileString(L"camera", L"ip", L"", lpValue, sizeof(TCHAR) * 100, strConfigFile);
void CCtMediaSvrConfigDlg::ReadConfig()
{
	CString strConfigFile;
	strConfigFile = GetAbsolutePath(_T("config.ini"));
	int i = GetPrivateProfileInt(_T("Custom_Config"), _T("m_nTest"), 12345, strConfigFile); //如果没有从配置文件中找到,则默认为12345
}
void CCtMediaSvrConfigDlg::SaveConfig()
{
	CString strConfigFile;
	CString str;
	strConfigFile = GetAbsolutePath(_T("config.ini"));
	str.Format(_T("%d"), 10);
	::WritePrivateProfileString(_T("Custom_Config"), _T("m_nTest"), str, strConfigFile);
} 
CString strConfigFile;
strConfigFile = GetAbsolutePath(_T("config.ini"));
::WritePrivateProfileString(_T("camera"), _T("ip"), DeviceIp, strConfigFile);
::WritePrivateProfileString(_T("camera"), _T("port"), strPort, strConfigFile);
::WritePrivateProfileString(_T("camera"), _T("user"), m_csUser, strConfigFile);
::WritePrivateProfileString(_T("camera"), _T("pwd"), m_csPWD, strConfigFile);

平台语言一直用的是C++, 也可以把配置做成json 格式。程序中需要引入json的开源裤,jsoncpp,网上教程有很多,这里就不多说。然后配置文件就按照json 格式配置。jsoncpp 使用的时候也挺坑的,C++一些辅助的工具裤,使用起来就不那么让人满意。不如别的语言支持的那么好,不顾c++ 总体来说也不是为了处理这些问题的。C++新的标准也越来越好用,通过标准引入的新特性,用起来很爽。这个以后慢慢介绍。C++感觉也要变得越来越(●-●) 了。


    第一次写这样的技术累博客,感觉好多话没说太清楚。以后慢慢提高。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老朱自强不息

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值