AppSettings for Compact Framework 的实现
学习如何创建一个设置类,以便轻松访问和存储您的应用程序设置。
引言
.NET Compact Framework 不包含像完整框架那样的 AppSettings
类。在完整 .NET Framework 中,开发人员可以通过从 System.Configuration.ConfigurationSettings.AppSettings
类创建名称值集合来访问存储在 App.Config 文件中的设置。作为统一性的倡导者,我希望在紧凑框架上创建一些具有类似功能的工具。本文将展示我所做的。
使用代码
我的第一步是创建一个类似于 .NET 中的 App.Config 文件的 XML 文件。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="ServerIP" value="192.168.5.22" />
<add key="UserName" value="testuser" />
<add key="Password" value="jdhs822@@*" />
<add key="PhoneNumber" value="5555555555" />
<add key="TimeOut" value="60" />
<add key="LastTransmit" value="03/03/2004 9:12:33 PM" />
<add key="DatabasePath" value="\Program Files\DB\test.sdf" />
</appSettings>
</configuration>
我将此文件命名为 Settings.xml,并将其添加到我的项目中,构建操作设置为“内容”。这确保了该文件将被下载到我的程序的执行文件夹中。
我的下一步是创建一个名为 Settings
的新类。该类仅包含静态成员,因此设置仅在程序执行期间从文件中访问一次,并且整个程序将可以轻松访问这些值。
我希望设置在访问设置时立即加载,因此我创建了一个静态构造函数,并将我的 XML 解析代码放在构造函数中。
m_settings
是一个 NameValueCollection
,用于存储所有设置。
public class Settings
{
private static NameValueCollection m_settings;
private static string m_settingsPath;
// Static Ctor
static Settings()
{
// Get the path of the settings file.
m_settingsPath = Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
m_settingsPath += @"\Settings.xml";
if(!File.Exists(m_settingsPath))
throw new FileNotFoundException(
m_settingsPath + " could not be found.");
System.Xml.XmlDocument xdoc = new XmlDocument();
xdoc.Load(m_settingsPath);
XmlElement root = xdoc.DocumentElement;
System.Xml.XmlNodeList nodeList = root.ChildNodes.Item(0).ChildNodes;
// Add settings to the NameValueCollection.
m_settings = new NameValueCollection();
m_settings.Add("ServerIP", nodeList.Item(0).Attributes["value"].Value);
m_settings.Add("UserName", nodeList.Item(1).Attributes["value"].Value);
m_settings.Add("Password", nodeList.Item(2).Attributes["value"].Value);
m_settings.Add("PhoneNumber",
nodeList.Item(3).Attributes["value"].Value);
m_settings.Add("TimeOut", nodeList.Item(4).Attributes["value"].Value);
m_settings.Add("LastTransmit",
nodeList.Item(5).Attributes["value"].Value);
m_settings.Add("DatabasePath",
nodeList.Item(6).Attributes["value"].Value);
}
}
现在,我们需要一些公共访问器来从 NameValueCollection
中检索值。
public static string ServerIP
{
get { return m_settings.Get("ServerIP"); }
set { m_settings.Set("ServerIP", value); }
}
public static string UserName
{
get { return m_settings.Get("UserName"); }
set { m_settings.Set("UserName", value); }
}
// ... And so on
剩下的唯一一件事是添加一个方法来更新我们的设置。XmlTextWriter
类为我们提供了一种轻量级的机制,用于将 xml 写入 FileStream
。我们遍历 NameValueCollection
并以 xml 格式创建设置。
public static void Update()
{
XmlTextWriter tw = new XmlTextWriter(m_settingsPath,
System.Text.UTF8Encoding.UTF8);
tw.WriteStartDocument();
tw.WriteStartElement("configuration");
tw.WriteStartElement("appSettings");
for(int i=0; i<m_settings.Count; ++i)
{
tw.WriteStartElement("add");
tw.WriteStartAttribute("key", string.Empty);
tw.WriteRaw(m_settings.GetKey(i));
tw.WriteEndAttribute();
tw.WriteStartAttribute("value", string.Empty);
tw.WriteRaw(m_settings.Get(i));
tw.WriteEndAttribute();
tw.WriteEndElement();
}
tw.WriteEndElement();
tw.WriteEndElement();
tw.Close();
}
现在我们可以从应用程序中的任何地方轻松访问我们的设置了!