`
saybody
  • 浏览: 871688 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

在C#应用中,设计自己的配置文件

阅读更多
在系统开发的过程中,我们总是需要使用配置文件来保存一些我们需要保存的系统参数,毕竟这是.Net时代,如果再使用注册表那就显得复杂了,毕竟操作注册表的API并不是哪么容易理解的。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

所以在.net应用程序中,都默认出现一个App.Config(对于 Web应用程序是Web.Config)我们可以将系统运行所需要的参数采用加密或者明文的方式保存在这个文件中。但是当我们需要大量的,并且有一定逻辑结构的数据,希望也能够保存到配置文件中,此时我们可能这样做:将这些数据构造成DataSet,然后使用DataSet.WriteXML直接写成XML文件,读取的时候直接使用DataSet.LoadXML。另外一种方式就是直接操作XML数据,使用XmlDocument

第一种方法虽然是好,因为我们可以想操作数据库表一样操作我们的结构化的数据,可是在某些情况下,总觉得怪怪的。并且增加列等等这些的操作觉得及其难受。特别是我们需要使用这些数据的时候,我们首先要去读文档,了解DataSet中的每个表以及每个字段的含义,所以此方法不可取。

那第二种方法呢,这个更不可取。如果我们增加了某个字段,或者修改了数据的机构,那我们的代码修改起来是在也是比较复杂的事情。

那有什么更好的方式来解决这个问题的呢?

既然微软可以使用App.ConfigWeb.Config,可以使用ComfigManager来对这两个配置文件来进行管理,让我们非常方便地进行使用,那我们为何不可设计自己的ConfigManager呢?

需求:我们这里以菜单结构作为例子来描述我们的想法。

菜单,包括主菜单项,比如系统里面的“文件”,“编辑”等等,包括子菜单,比如“文件”下的“保存”,“另存为”等,子菜单下也包括下级子菜单。总之这是一个完全结构化的数据格式,当然使用菜单来举例主要是这东西我们每天都见到,所以很容易理解,如:

  1. publicclassMenu
  2. {
  3. privatestring_Name;
  4. privatestring_Text;
  5. privatestring_IconName;
  6. //...这里可能还有其他你需要变量
  7. privateSubMenus_SubMenus;
  8. ///<summary>
  9. ///注意,一定需要一个无参数的构造函数,否则序列化的时候出错
  10. ///</summary>
  11. publicMenu()
  12. :this("","","")
  13. {}
  14. publicMenu(stringname,stringtext,stringiconname)
  15. {
  16. this._Name=name;
  17. this._Text=text;
  18. this._IconName=iconname;
  19. this._SubMenus=newSubMenus();
  20. }
  21. ///<summary>
  22. ///菜单名
  23. ///</summary>
  24. [XmlAttribute("Name")]
  25. publicstringName
  26. {
  27. get{returnthis._Name;}
  28. set{this._Name=value;}
  29. }
  30. ///<summary>
  31. ///菜单Text
  32. ///</summary>
  33. [XmlAttribute("Text")]
  34. publicstringText
  35. {
  36. get{returnthis._Text;}
  37. set{this._Text=value;}
  38. }
  39. ///<summary>
  40. ///菜单的图标名
  41. ///</summary>
  42. [XmlAttribute("IconName")]
  43. publicstringIconName
  44. {
  45. get{returnthis._IconName;}
  46. set{this._IconName=value;}
  47. }
  48. ///<summary>
  49. ///子菜单
  50. ///</summary>
  51. publicSubMenusSubMenus
  52. {
  53. get{returnthis._SubMenus;}
  54. set{this._SubMenus=value;}
  55. }
  56. }

好,那我们菜单项包括子菜单,怎么表示呢?

我们使用一个List来保存我们的子菜单,为了更为直观,我们定义一个SubMenus的类,继承于List<Menu>

  1. ///<summary>
  2. ///子菜单列表
  3. ///</summary>
  4. publicclassSubMenus:List<Menu>
  5. {
  6. }

下面我们就来构造我们的菜单MenuStrip。一个MenuStrip中,同样包括多个菜单,比如“文件”“编辑”“视图”等等。

MenuStrip中,我们提供Load()函数,用于加载我们的菜单数据,提供Save()用于保存我们设置好的菜单数据:

  1. publicclassMenuStrip
  2. {
  3. //...您需要的其他变量
  4. privateSubMenus_SubMenus;
  5. publicMenuStrip()
  6. {
  7. this._SubMenus=newSubMenus();
  8. }
  9. publicSubMenusSubMenus
  10. {
  11. get{returnthis._SubMenus;}
  12. set{this._SubMenus=value;}
  13. }
  14. ///<summary>
  15. ///这里使用Static,方便调用
  16. ///</summary>
  17. ///<returns></returns>
  18. publicMenuStripLoad()
  19. {
  20. MenuStripinstance=newMenuStrip();
  21. XmlSerializerxs=newXmlSerializer(typeof(MenuStrip));
  22. StreamReadersr=newStreamReader(@"...\Menu.Config");
  23. instance=xs.Deserialize(sr)asMenuStrip;
  24. sr.Close();
  25. returninstance;
  26. }
  27. publicvoidSave()
  28. {
  29. XmlSerializerxs=newXmlSerializer(typeof(MenuStrip));
  30. StreamWritersw=newStreamWriter(@"...\Menu.Config");
  31. xs.Serialize(sw,this);
  32. sw.Close();
  33. }
  34. }

测试代码如下:

  1. MenuStripmenustrip=newMenuStrip();
  2. //文件菜单
  3. MenumnuFile=newMenu("mnuFile","文件(&F)","");
  4. mnuFile.SubMenus.Add(newMenu("mnuNew","新建",""));
  5. mnuFile.SubMenus.Add(newMenu("mnuSave","保存",""));
  6. mnuFile.SubMenus.Add(newMenu("mnuSaveAs","另存为",""));
  7. menustrip.SubMenus.Add(mnuFile);
  8. MenumnuEdit=newMenu("mnuEdit","编辑(&E)","");
  9. mnuEdit.SubMenus.Add(newMenu("mnuCopy","复制",""));
  10. mnuEdit.SubMenus.Add(newMenu("mnuDelete","删除",""));
  11. mnuEdit.SubMenus.Add(newMenu("mnuCut","剪切",""));
  12. menustrip.SubMenus.Add(mnuEdit);
  13. menustrip.SubMenus.Add(newMenu("mnuView","视图(&V)",""));
  14. menustrip.Save();

上面的代码构造了一个配置文件,保存后结果如下:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <MenuStripxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  3. <SubMenus>
  4. <MenuName="mnuFile"Text="文件(&F)"IconName="">
  5. <SubMenus>
  6. <MenuName="mnuNew"Text="新建"IconName="">
  7. <SubMenus/>
  8. </Menu>
  9. <MenuName="mnuSave"Text="保存"IconName="">
  10. <SubMenus/>
  11. </Menu>
  12. <MenuName="mnuSaveAs"Text="另存为"IconName="">
  13. <SubMenus/>
  14. </Menu>
  15. </SubMenus>
  16. </Menu>
  17. <MenuName="mnuEdit"Text="编辑(&E)"IconName="">
  18. <SubMenus>
  19. <MenuName="mnuCopy"Text="复制"IconName="">
  20. <SubMenus/>
  21. </Menu>
  22. <MenuName="mnuDelete"Text="删除"IconName="">
  23. <SubMenus/>
  24. </Menu>
  25. <MenuName="mnuCut"Text="剪切"IconName="">
  26. <SubMenus/>
  27. </Menu>
  28. </SubMenus>
  29. </Menu>
  30. <MenuName="mnuView"Text="视图(&V)"IconName="">
  31. <SubMenus/>
  32. </Menu>
  33. </SubMenus>
  34. </MenuStrip>

您可能会说,这样也不见得很好啊,但是你是否发现,我们就像使用菜单对象一样来操作我们的Menu对象,我们不需要像使用DataSet那样首先要去了解其中每个数据库表的每个字段的含义,也不需要像使用XmlDocument那样去记住每个菜单项的位置。菜单项就是我们的Menu对象,我们可以增加不限级的子菜单,随意遍历我们的菜单等等。

另,通过这样的方式,可以在我们的应用中设计各种各样易于使用修改和维护的结构。

分享到:
评论

相关推荐

    基于ASP.NET CORE的C# Web应用程序设计源码

    ASP.NET CORE应用程序:基于C#开发,包含185个文件,包括52个JPG图像文件、49个C#类文件、27个C#HTML文件、18个JSON配置文件、14个PNG图像文件、12个CSS样式文件、6个解决方案文件(.csproj)和1个.editorconfig文件...

    基于ASP.NET和C#的Web应用程序设计源码

    本资源提供了一套基于ASP.NET和C#的Web应用程序设计源码,包含177个文件,其中包括60个配置文件,53个C#源代码文件,17个ASPX页面文件,15个解决方案文件(.sln),15个项目文件(.csproj),10个JPEG图片文件,以及...

    C#开发软件课程设计学生信息管理系统项目源代码.zip

    mysql数据库文件在文件中Resources/MysqlData/database_test0.sql可以使用 数据库可视化软件(如HideSQL)进行导入 。 使用了MaterialDesign 框架 需要自行Nuget搜索安装 可百度使用教程 数据库配置在Resources/...

    基于ASP.NET Core的C# Web应用程序设计源码

    ASP.NET Core Web应用程序:基于C#开发,包含1467个文件,包括1330个WebP图像文件、52个JPG图像文件、20个C#类文件、15个C#HTML文件、15个PNG图像文件、10个CSS样式文件、9个JSON配置文件、8个JavaScript文件和4个....

    Visual C# 2010程序设计教程PPT

    Visual C# 2010程序设计教程PPT " 第1章 NET平台与Visual Studio 2010开发工具 " " .NET平台的概念及理解 " .NET平台的架构 命名空间的概念及使用 Visual Studio 2010开发工具的使用 使用Visual ...

    基于C#和MySql的图书管理系统设计源码

    本项目是基于C#和MySql开发的图书管理系统设计源码,主要使用C#进行开发。项目共包含203个文件,其中C#源代码文件57个,DLL...项目结构清晰,代码注释详尽,适合用于学习和研究C#和MySql在图书管理系统开发中的应用。

    基于ASP.NET Core的C#学习设计源码

    文件类型包括1330个WEBP图片文件、52个JPG图片文件、33个C#源代码文件、15个CSHTML页面文件、15个PNG图片文件、12个JSON配置文件、9个CSS样式文件、8个JavaScript脚本文件、4个CSPROJ文件和1个GITATTRIBUTES文件。...

    基于C#的Winform图书管理系统设计源码

    项目包含129个文件,其中包括50个C#源文件、23个资源文件、23个资源文件、5个缓存文件、4个VSIDX文件、4个应用程序文件、4个EXE文件、3个清单文件、2个配置文件和2个PDB文件。这个系统是一个用于图书馆或书店的图书...

    基于C# Winform的飞机大战小游戏设计源码

    本项目是基于C# Winform开发的飞机大战小游戏设计源码,主要使用C#进行开发。项目共包含161个文件,其中PNG图片文件74个,C#源代码...项目结构清晰,代码注释详尽,适合用于学习和研究C#在Winform小游戏开发中的应用。

    基于MVC三层架构的C#仓库管理系统设计源码

    本项目是基于MVC三层架构开发的C#仓库管理系统设计源码,主要使用C#进行开发。项目共包含35个文件,其中CSHTML页面文件17个...项目结构清晰,代码注释详尽,适合用于学习和研究MVC三层架构在仓库管理系统开发中的应用。

    asp.net FTP客户端设计与开发,利用C#语言来设计和开发的 FTP客户端分为连接模块、文件管理模块、文件传输模块和辅助管

    FTP客户端软件是在了解FTP工作原理后,利用C#语言来设计和开发的。FTP客户端分为连接模块、文件管理模块、文件传输模块和辅助管理模块。连接模块实现主机与服务器的连接的功能;文件管理模块实现新建文件、删除文件...

    ASP.NET WEB应用程序设计教程(单维锋编著) 图书例子代码-校园音乐吧项目(c#)

    全书共14章,内容包括Web应用程序概念、HTML、DHTML、 C#语言基础、ADO.NET、服务器端标准控件、数据验证控件、导航控件、内部对象、数据绑定控件、母版页、主题与皮肤、AJAX技术、应用程序配置以及软件测试和部署...

    Web程序设计课件 C#.Net语言在VS.Net2005平台上进行Web程序设计

    通过本课程的学习,使学生进一步了解面向对象的基本概念和使用面向对象技术进行程序设计的基本思想,使用C#.Net语言在VS.Net2005平台上进行Web程序设计。 重点内容: 使用C#.Net语言能够进行动态网站建设和维护等...

    C#编程兵书(完整扫描版 )pdf格式 电子书

    本书运用大量示例,让读者在实战中体会编程的乐趣。本书适合想从事软件开发的入门人员、C#自学者及初级软件程序员和信息技术人员阅读。 章节目录: 第一篇 开发环境与C#语言基础 第一章 仙人指路: C#与.NET ...

    基于.NET和C#的Sundial分布式作业调度系统设计源码

    本资源提供了一套基于.NET和C#的Sundial分布式作业调度系统设计源码,包含115个文件,其中包括88个C#源代码文件,4个Markdown文档,4个JSON配置文件,3个项目文件(.csproj),2个JavaScript脚本文件,2个Map文件,1...

    基于.NET的SunnyUI.NET开源控件库设计源码

    文件类型包括357个C#源代码文件、121个资源文件、76个PNG图片文件、7个TTF字体文件、3个Markdown文档、3个配置文件、3个ICO图标文件、2个EditorConfig文件、2个SLN解决方案文件和2个DLL库文件。适合用于学习和实践C#...

    软件设计模式实验报告(Java实现)

    如果在系统运行中,有很多地方都需要使用配置文件的内容,系统中会同时存在多份配置文件的内容,这会严重浪费内存资源。 事实上,对于AppConfig类,在运行期间,只需要一个对象实例就够了。那么应该怎么实现呢?用C#...

Global site tag (gtag.js) - Google Analytics