.Net中利用config檔案來儲存資訊
前言:
在做一些專案時,往往會有站點的一些配置資訊需要儲存,比如站點名稱,電話,聯絡人,郵箱這些等等,又因為此資訊不經常更新,而且是單一的,所以放入資料庫中會感覺佔用了不必要的一些資源。所以就會想到這些資訊放入檔案中來儲存。下面是我的一個例子,分享給大家。
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交流會所
歡迎加入.net技術交流群
相關推薦
.Net中利用config檔案來儲存資訊
前言: 在做一些專案時,往往會有站點的一些配置資訊需要儲存,比如站點名稱,電話,聯絡人,郵箱這些等等,又因為此資訊不經常更新,而且是單一的,所以放入資料庫中會感覺佔用了不必要的一些資源。所以就會想到這些資訊放入檔案中來儲存。下面是我的一個例子,分
asp.net 中利用 js 獲取地址欄參數
.net provide ram UNC color 進行 ref name function 1、aspx頁面,進行頁面跳轉 window.location.href = "ProviderInfo.aspx?ProviderID="+ProviderID; 2、P
淺析C++中的開啟檔案、儲存檔案(OPENFILENAME)
首先看看msdn上如何描述的: Contains information that the GetOpenFileName and GetSaveFileName functions use to initialize an Open or Save As dialog box
2018/08/03 xml框架主要用來儲存資訊,不需要在網頁顯示資訊
XML用來儲存資訊,不需要顯示出來 XML(可擴充套件標記語言)(不需要編譯的語言) XML 好處:其實hml=xml+http4(跨平臺開發,既能寫移動端,也能寫pc) 1.支援跨平臺,各系統; 2.可以自由編寫標籤,可擴充套件性比較好 3.用於儲存資料html5(顯示資料)
【Linux】關於mpiexec中的config檔案可以在提交程式後修改
演算法評測需要跑很多次取均值,因此離不開linux叢集。 叢集上並行執行多次的命令是mpiexec,執行10次的命令是:mpiexec -n 10 -f config nohup python hel
.Net 中的反射(檢視基本型別資訊)
反射概述 和Type類 1.反射的作用 簡單來說,反射提供這樣幾個能力:1、檢視和遍歷型別(及其成員)的基本資訊和程式集元資料(metadata);2、遲繫結(Late-Binding)方法和屬性。3、動態建立型別例項(並可以動態呼叫所建立的例項的方法、欄位、屬性)。序
.Net中Cofnig配置檔案的正規寫法
以下內容以FastSocket為例子 配置節點XML寫法 <configuration> <configSections> <sectio
ASP.NET中利用Application和Session統計線上人數、歷史訪問量
先來簡單說一下ASP.NET中的Application和Session 下圖是我們非常熟悉的Web應用程式的結構: 在這張圖中,Web伺服器中執行的Web應用程式就是我們所說的Applicati
(轉).net中匯入excel檔案顯示進度條
<tr> <td align="center" style="height: 25px; width: 100px;">父分類</td> <td valign="middle" style="height: 25px">
ASP.NET中利用DataGrid控制元件顯示圖片以及在圖片和文字上加超連結
資料表: 介面程式碼: <asp:DataGrid ID="DataGrid1" runat="server" AutoGenerateColumns="False" BorderWidth="0px" PageSiz
Spring中利用配置檔案和@value注入屬性值
1 簡單屬性值注入 package com.xy.test1; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service;
在.NET中利用SQLite ADO.NET使用SQLite資料庫
System.Data.SQLite 是一個原始SQLite的加強版. 它將是一個原版的sqlite3.dll完全替代品 (你甚至就可以把它重新命名為sqlite3.dll). 它不需要連結.NET 執行時,所以可以脫離.NET獨立釋出, 然而它內嵌了一個完整的 ADO.NET 2.0 引擎,為開發提供了
VB.NET中操作xml檔案
已知有一個XML檔案(bookstore.xml)如下: <?xml version="1.0" encoding="gb2312"?> <bookstore> <book genre="fantasy" ISBN="2-3631-4">
Asp.net中Web.config連線字串及配置資料庫sqlserver,詳細
近日正在看Asp.net,看到Web.config有很不清楚之處,特意從網路、MSDN蒐集、歸納和整理,供大家分享。在ASP.NET的web.config中,可以用兩種方式來寫連線字串的配置。<configuration> <appSettings&g
ASP.NET中利用DataGrid實現高效分頁
ASP.Net中的DataGrid有內建分頁功能, 但是它的預設的分頁方式效率是很低的,特別是在資料量很大的時候,用它內建的分頁功能幾乎是不可能的事,因為它會把所有的資料從資料庫讀出來再進行分頁, 這種只選取了一小部分而丟掉大部分的方法是不可去取的. 在最進的一個專案中
Asp.net 中幾種檔案下載方式
C# code ASP.NET檔案下載 //TransmitFile實現下載 protected void Button1_Click(object sender, EventArgs e) { /* 微軟為Response
Spring中核心配置檔案載入頭部資訊的兩種方式
1、沒有外掛的情況下:官網拷貝程式碼複製<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
asp.net 中 mdf 資料庫檔案的使用
然後檢視原始碼目錄下的連線字串 <connectionStrings> <add name="SperConnectionString1" connectionString="Data Source=.\SQLEXPRESS;User ID=sa;pwd=sa;Initial Catal
在ASP.NET中實現多檔案上傳
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="MultiFileUpload.aspx.cs" Inherits="MultiFileUpload"%><!DOCTYPE html PUBLIC "-//W3C//DTD
Asp.net中Web.config連線字串及配置資料庫sqlserver
近日正在看Asp.net,看到Web.config有很不清楚之處,特意從網路、MSDN蒐集、歸納和整理,供大家分享。 在ASP.NET的web.config中,可以用兩種方式來寫連線字串的配置。 <configuration> <appSettin