前言:
在做一些项目时,往往会有站点的一些配置信息需要保存,比如站点名称,电话,联系人,邮箱这些等等,又因为此信息不经常更新,而且是单一的,所以放入数据库中会感觉占用了不必要的一些资源。所以就会想到这些信息放入文件中来保存。下面是我的一个例子,分享给大家。
1.我的项目是用的三层来写的,我就按照三层的方式给大家呈现一下,为了方便查询,我的文件名命名会加上当前层的首字母,M D B来区分。
首先创建一个Model层的实体 M_T_SysSet,下面的我的实体类中的字段信息。
namespace WitWMS.Model{
//T_SysSet
/// <summary>
/// 系统基本信息设置 Model
/// T_SysSet
/// </summary>
public class M_T_SysSet
{
public M_T_SysSet()
{
}
private string _sysname="";
/// <summary>
/// 系统名称
/// </summary>
public string SysName
{
get{ return _sysname; }
set{ _sysname = value; }
}
private string _syskeyword = "";
/// <summary>
/// 系统关键词
/// </summary>
public string SysKeyWord
{
get{ return _syskeyword; }
set{ _syskeyword = value; }
}
private string _syshot = "";
/// <summary>
/// 系统敏感词
/// </summary>
public string SysHot
{
get{ return _syshot; }
set{ _syshot = value; }
}
private string _icp = "";
/// <summary>
/// 网站ICP备案号
/// </summary>
public string ICP
{
get{ return _icp; }
set{ _icp = value; }
}
private string _email = "";
/// <summary>
/// 邮件地址
/// </summary>
public string Email
{
get{ return _email; }
set{ _email = value; }
}
private string _tel = "";
/// <summary>
///联系电话
/// </summary>
public string Tel
{
get{ return _tel; }
set{ _tel = value; }
}
private string _address = "";
/// <summary>
/// 联系地址
/// </summary>
public string Address
{
get{ return _address; }
set{ _address = value; }
}
private int _webstate;
/// <summary>
/// 网站当前状态 0维护 1开放
/// </summary>
public int WebState
{
get{ return _webstate; }
set{ _webstate = value; }
}
private string _maintain = "";
/// <summary>
/// 维护说明
/// </summary>
public string MainTain
{
get{ return _maintain; }
set{ _maintain = value; }
}
private int _photosize;
/// <summary>
/// 上传图片大小设置
/// </summary>
public int PhotoSize
{
get{ return _photosize; }
set{ _photosize = value; }
}
private string _stopregcause = "";
/// <summary>
/// 注册停止原因
/// </summary>
public string StopRegCause
{
get{ return _stopregcause; }
set{ _stopregcause = value; }
}
private int _filesize;
/// <summary>
/// 附件大小
/// </summary>
public int FileSize
{
get { return _filesize; }
set { _filesize = value; }
}
}
}
2.有了model层,肯定还需要DAL层。
namespace WitWMS.DAL
{
/// <summary>
/// 系统基本信息设置 DAL
/// </summary>
public partial class D_T_SysSet
{
public D_T_SysSet()
{
}
#region 数据访问类:站内配置,通过配置文件 实现
private static object lockHelper = new object();
/// <summary>
/// 读取站点配置文件
/// </summary>
public M_T_SysSet loadConfig(string configFilePath)
{
return (M_T_SysSet)SerializationHelper.Load(typeof(M_T_SysSet), configFilePath);
}
/// <summary>
/// 写入站点配置文件
/// </summary>
public M_T_SysSet saveConifg(M_T_SysSet model, string configFilePath)
{
lock (lockHelper)
{
SerializationHelper.Save(model, configFilePath);
}
return model;
}
#endregion
}
}
3.BLL层。
namespace WitWMS.BLL
{
/// <summary>
/// 系统基本信息设置 BLL
/// </summary>
public partial class B_T_SysSet
{
private readonly D_T_SysSet dal = new D_T_SysSet();
/// <summary>
/// 系统基本信息设置 构造函数
/// </summary>
public B_T_SysSet(){ }
#region 添加通过配置文件 读取配置项
/// <summary>
/// 读取配置文件
/// </summary>
public M_T_SysSet loadConfig(string configFilePath)
{
M_T_SysSet model = CacheHelper.Get<M_T_SysSet>("cache_site_config");
if (model == null)
{
CacheHelper.Insert("cache_site_config", dal.loadConfig(configFilePath), configFilePath);
model = CacheHelper.Get<M_T_SysSet>("cache_site_config");
}
return model;
}
/// <summary>
/// 读取客户端站点配置信息
/// </summary>
public M_T_SysSet loadConfig(string configFilePath, bool isClient)
{
M_T_SysSet model = CacheHelper.Get<M_T_SysSet>("cache_site_client_config");
if (model == null)
{
model = dal.loadConfig(configFilePath);
CacheHelper.Insert("cache_site_client_config", model, configFilePath);
}
return model;
}
/// <summary>
/// 保存配置文件
/// </summary>
public M_T_SysSet saveConifg(M_T_SysSet model, string configFilePath)
{
return dal.saveConifg(model, configFilePath);
}
#endregion
}
}
4.这里还用到了一些辅助类,我把一些常用的辅助类集中放入了Common类库中,方便管理 。
4.1缓存操作类 CacheHelper
namespace WitWMS.Common
{
/// <summary>
/// 缓存操作类
/// </summary>
public class CacheHelper
{
/// <summary>
/// 创建缓存项的文件依赖
/// </summary>
/// <param name="key">缓存Key</param>
/// <param name="obj">object对象</param>
/// <param name="fileName">文件绝对路径</param>
public static void Insert(string key, object obj, string fileName)
{
//创建缓存依赖项
CacheDependency dep = new CacheDependency(fileName);
//创建缓存
HttpContext.Current.Cache.Insert(key, obj, dep);
}
/// <summary>
/// 创建缓存项过期
/// </summary>
/// <param name="key">缓存Key</param>
/// <param name="obj">object对象</param>
/// <param name="expires">过期时间(分钟)</param>
public static void Insert(string key, object obj, int expires)
{
HttpContext.Current.Cache.Insert(key, obj, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, expires, 0));
}
/// <summary>
/// 获取缓存对象
/// </summary>
/// <param name="key">缓存Key</param>
/// <returns>object对象</returns>
public static object Get(string key)
{
if (string.IsNullOrEmpty(key))
{
return null;
}
return HttpContext.Current.Cache.Get(key);
}
/// <summary>
/// 获取缓存对象
/// </summary>
/// <typeparam name="T">T对象</typeparam>
/// <param name="key">缓存Key</param>
/// <returns></returns>
public static T Get<T>(string key)
{
object obj = Get(key);
return obj == null ? default(T) : (T)obj;
}
}
}
4.2序列化与反序列化操作类 SerializationHelper
namespace WitWMS.Common
{
/// <summary>
/// 序列化与反序列化操作
/// </summary>
public class SerializationHelper
{
public SerializationHelper() { }
/// <summary>
/// 反序列化
/// </summary>
/// <param name="type">对象类型</param>
/// <param name="filename">文件路径</param>
/// <returns></returns>
public static object Load(Type type, string filename)
{
FileStream fs = null;
try
{
// open the stream...
fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
XmlSerializer serializer = new XmlSerializer(type);
return serializer.Deserialize(fs);
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (fs != null) {
fs.Close();
}
}
}
/// <summary>
/// 序列化
/// </summary>
/// <param name="obj">对象</param>
/// <param name="filename">文件路径</param>
public static void Save(object obj, string filename)
{
FileStream fs = null;
// serialize it...
try
{
fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
XmlSerializer serializer = new XmlSerializer(obj.GetType());
serializer.Serialize(fs, obj);
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (fs != null)
{
fs.Close();
}
}
}
}
}
4.3 Utils类
#region 获得配置文件节点XML文件的绝对路径
public static string GetXmlMapPath(string xmlName)
{
return GetMapPath(ConfigurationManager.AppSettings[xmlName].ToString());
}
#endregion
#region 获得当前绝对路径
/// <summary>
/// 获得当前绝对路径
/// </summary>
/// <param name="strPath">指定的路径</param>
/// <returns>绝对路径</returns>
public static string GetMapPath(string strPath)
{
if (strPath.ToLower().StartsWith("http://"))
{
return strPath;
}
if (HttpContext.Current != null)
{
return HttpContext.Current.Server.MapPath(strPath);
}
else //非web程序引用
{
strPath = strPath.Replace("/", "\\");
if (strPath.StartsWith("\\"))
{
strPath = strPath.Substring(strPath.IndexOf('\\', 1)).TrimStart('\\');
}
return System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, strPath);
}
}
#endregion
5.我们还需要一个config文件,在你需要的地方创建一个config文件,我创建了一个文件夹,专门放置一些config文件,我的是:xmlConfig/site.config,可以根据自己需要创建。
<?xml version="1.0"?>
<M_T_SysSet>
</M_T_SysSet>
创建好以后,根节点最好命名成与你的Model层中配置类相同的名称,也是为了方便后期查看修改。
6.做好前面的,我们还需要一步操作,把这个config文件的路径保存在我们的web.config文件中,当然你也可以直接写入你的程序中,不过建议写入web.config中,因为你可能有多个config文件,这样方便管理。
在你的web.config中的appSettings节点中创建。
<appSettings>
<add key="Configpath" value="/xmlConfig/site.config"/>
</appSettings>
7.所有都完工了,我们现在需要在页面上填入来保存这些信息了。创建你自己的编辑信息文件,也就是aspx页面。
名称自己定,前台的我就不展示了,就是些输入框,我来展示我后台的编辑代码。
7.1这是显示信息方法
/// <summary>
/// 显示信息
/// </summary>
private void ShowInfo()
{
//前面 我已经定义好了一个实体对象_mTSysSet
_mTSysSet = _bTSysSet.loadConfig(Utils.GetXmlMapPath("Configpath"));
// hidden.Value = _mTSysSet.ID.ToString();
sysname.Text = _mTSysSet.SysName;
syskeyword.Text = _mTSysSet.SysKeyWord;
syshot.Text = _mTSysSet.SysHot;
icp.Text = _mTSysSet.ICP;
email.Text = _mTSysSet.Email;
tel.Text = _mTSysSet.Tel;
address.Text = _mTSysSet.Address;
webstate.SelectedValue = _mTSysSet.WebState.ToString();
maintain.Text = _mTSysSet.MainTain;
photosize.Text = _mTSysSet.PhotoSize.ToString();
filesize.Text = _mTSysSet.FileSize.ToString();
}
7.2这是保存信息方法。
/// <summary>
/// 保存配置信息
/// </summary>
protected void btnSubmit_Click(object sender, EventArgs e)
{
_mTSysSet = _bTSysSet.loadConfig(Utils.GetXmlMapPath("Configpath"));
try
{
_mTSysSet.SysName = sysname.Text;
_mTSysSet.SysKeyWord = syskeyword.Text;
_mTSysSet.SysHot = syshot.Text;
_mTSysSet.ICP = icp.Text;
_mTSysSet.Email = email.Text;
_mTSysSet.Tel = tel.Text;
_mTSysSet.Address = address.Text;
_mTSysSet.WebState = Convert.ToInt32(webstate.SelectedValue);
_mTSysSet.MainTain = maintain.Text;
_mTSysSet.PhotoSize = Convert.ToInt32(photosize.Text);
_mTSysSet.FileSize = Convert.ToInt32(filesize.Text);
_bTSysSet.saveConifg(_mTSysSet, Utils.GetXmlMapPath("Configpath"));
JscriptMsg("系统提示:修改系统信息成功啦!", "sys_config.aspx", "Success");
}
catch(Exception ex)
{
JscriptMsg("系统提示:修改系统信息失败啦!", "", "Error");
}
}
8.总结
配置文件保存一些不经常修改的站点信息,这样做不用频繁访问数据库去读取一成不变的信息,要知道,数据库连接资源是很宝贵的,频繁占用一个连接资源,却做着一成不变的事情,就是在做无用功,不如把这宝贵的连接资源让给有用的数据访问。
9..Net交流会所