在開發(fā)網(wǎng)站的時候我們常常會用到一些配置文件,在.Net2.0下面微軟給我們提供了一個ConfigurationManager這樣一個類來管理存儲 于配置文件中的信息,這樣我們將配置項寫在web.config 文件的AppSettings這一節(jié)里面就可以使用鍵值直接來訪問它了。
就象這樣System.Configuration.ConfigurationManager.AppSettings["MyNameIs"], 但是這里有個問題就是我們有一些設(shè)置希望在運行時可以通過網(wǎng)絡(luò)訪問的形式去作配置而不是手動修改web.config,但是 ConfigurationManager并沒有給我們提供一個方法來保存我們的設(shè)置(或者是我不知道,還有別的方法吧).還有一個原因是因為.Net運 行框架會在應(yīng)用程序啟動后自動監(jiān)視web.config,一旦這個文件被修改應(yīng)用程序會自動重啟這樣的話我們的一些狀態(tài)數(shù)據(jù)就會丟失,有沒有更好的辦法 呢,其實是有的,我們的解決方案就是使用獨立的可讀寫配置文件.先來看看代碼吧.
using System;
using System.Web;
using System.IO;
using System.Xml.Serialization;
namespace GB.Utility
{
///
/// 全站配置文件讀寫
///
[Serializable]
public class SiteSettings
{
private static readonly string currentConfigFileName = "GBSettings.config";
#region PublicProperty
#region AbsoluteWebRoot
private string absoluteWebRoot;
///
/// 站點的絕對Url引用
///
public string AbsoluteWebRoot
{
get { return absoluteWebRoot; }
set { absoluteWebRoot = string.IsNullOrEmpty(value) ? string.Empty : value; }
}
#endregion
#region RelativeWebRoot
private string relativeWebRoot;
///
/// 站點的相對Url引用
///
public string RelativeWebRoot
{
get { return relativeWebRoot; }
set { relativeWebRoot = string.IsNullOrEmpty(value) ? string.Empty : value; }
}
#endregion
#region DefaultPageSize
private int defaultPageSize;
///
/// 默認(rèn)的分頁大小
///
public int DefaultPageSize
{
get { return defaultPageSize; }
set { defaultPageSize = value; }
}
#endregion
#region DefaultAbstractSize
private int defaultAbstractSize;
///
/// 默認(rèn)的摘要長度值
///
public int DefaultAbstractSize
{
get { return defaultAbstractSize; }
set { defaultAbstractSize = value; }
}
#endregion
#region Theme
private string theme;
///
/// 風(fēng)ge設(shè)定
///
public string Theme
{
get { return theme; }
set { theme = value; }
}
#endregion
#endregion
#region Common Members
#region Private Members
private static string _configurationFilePath =
System.IO.Path.Combine(
System.AppDomain.CurrentDomain.BaseDirectory.Replace("/", System.IO.Path.DirectorySeparatorChar.ToString()),
currentConfigFileName);
private static SiteSettings _currentConfiguration;
#endregion
#region Constructor
private SiteSettings()
{
}
#endregion
public static SiteSettings Instance
{
get
{
if (_currentConfiguration == null)
{
Load();
if (_currentConfiguration == null)
_currentConfiguration = new SiteSettings();
}
return _currentConfiguration;
}
}
private static void Load()
{
if (!File.Exists(_configurationFilePath))
{
throw new Exception("Can't locate config file! Check the config file path.");
_currentConfiguration = new SiteSettings();
}
else
{
XmlSerializer ser = new XmlSerializer(typeof(SiteSettings));
StreamReader reader = new StreamReader(_configurationFilePath);
// XML 反序列化.
_currentConfiguration = (SiteSettings)ser.Deserialize(reader);
reader.Close();
}
}
private static void Load(string configFile)// 這個方法如果改為公開方案那么可以在運行時來讀取合適的配置文件,這樣就避免在布署時修改多個功能項.
{
_configurationFilePath = configFile;
Load();
}
public static void Save()
{
XmlSerializer ser = new XmlSerializer(typeof(SiteSettings));
FileStream fileOut;
if (!File.Exists(_configurationFilePath))
{
fileOut = new FileStream(_configurationFilePath, FileMode.CreateNew, FileAccess.ReadWrite, FileShare.ReadWrite);
}
else
{
fileOut = new FileStream(_configurationFilePath, FileMode.Truncate, FileAccess.ReadWrite, FileShare.ReadWrite);
}
// Serialize the object in XML to the given file stream.
ser.Serialize(fileOut, _currentConfiguration);
// Close the file stream.
fileOut.Close();
}
private static string GetBaseDirectory()
{
return System.AppDomain.CurrentDomain.BaseDirectory;
}
#endregion
}
}
這樣我們在站點根目錄下面建立一個名為"GBSettings.config"的配置文件就可以對它進行讀寫操作了.
它里面的內(nèi)容:
Http://Localhost/
GBWeb/
20
200
default
大家注意到這里面的字段和我們建立的類里面的公開屬性是一一對應(yīng)的, 因此如果需要增加新的可配置項目只要添加相關(guān)的公開屬性即可,其它的公共代碼部分就不 用動了, 這個配置文件類使用單例模式一次性加載文件,在訪問速度上是足夠快了.并且在配置文件修改的時候不會引起應(yīng)用程序的重起,只需要調(diào)用 Save()方法即可生效, 真是非常方便呀。
還沒有完?對,還有一個問題,這樣的代碼是可測試的嗎,當(dāng)然, 這里以NUnit為例, 在測試時只需要將配置文件拷貝至測試工程的根目錄,注意這里的生成選項使用復(fù)制到輸出目錄,在文件較新時復(fù)制. 當(dāng)然,web.cofig也要拷貝至測試 工程根目錄下面并改名為 測試工程名稱.dll.config 就可以了. 測試代碼如下:
[Test]
public void ConfigFileTest()
{
SiteSettings.Instance.Theme = "default";
Assert.IsTrue(SiteSettings.Instance.Theme.Equals("default", StringComparison.InvariantCultureIgnoreCase));
SiteSettings.Instance.Theme = "blue";
SiteSettings.Save();
Assert.IsTrue(SiteSettings.Instance.Theme.Equals("blue",StringComparison.InvariantCultureIgnoreCase));
}
在NUnit中可以看到測試已經(jīng)通過。
新聞熱點
疑難解答
圖片精選