Net 自定义应用程序配置Word文档格式.docx
《Net 自定义应用程序配置Word文档格式.docx》由会员分享,可在线阅读,更多相关《Net 自定义应用程序配置Word文档格式.docx(36页珍藏版)》请在冰点文库上搜索。
![Net 自定义应用程序配置Word文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/9/6a8ae090-27ff-4177-8964-352235ae1036/6a8ae090-27ff-4177-8964-352235ae10361.gif)
];
form1.Controls.Add(siteName);
}
上面这段代码大家应该再熟悉不过了,我们在appSettings结点中添加了一个add子结点,给key和value属性赋了值,然后在程序中读取了值。
但是为什么可以这么做?
如果我们想自定义一个配置系统,我们该怎么做呢?
我们先抛开.Net的机制不谈,来看看如果自己实现一个应用程序的配置方法该如何做,我想可以是这样的:
1.首先建立一个XML文件,在这个文件中创建我们需要的结点(或者结点树),在结点的属性或者文本(innerText)中存储配置值。
2.创建一个类,这个类的字段和属性映射XML中的某个结点下的属性和文本,以提供强类型的访问。
3.创建一个配置文件Xml的访问类,在下面添加一个方法,比如叫GetSection(stringnodeName),参数nodeName是结点(或者结点树的根节点)的名称。
在方法内部,先创建第二步的类型实例,然后使用System.Xml命名空间下的方法对结点进行处理,对实例的属性进行赋值,最后返回这个实例。
4.在程序中通过这个实例来访问配置的结点值。
上面的思路应该是很清晰的,可是存在一个问题:
我们的XML文件中可能会包含多个结点,而每个结点的结构可能都不相同。
比如说:
每个结点下的子结点可能不相同,每个结点的属性可能不相同。
这样的话,我们的GetSection()方法实际上只能是针对某个特定的结点进行。
那么该怎么办呢?
我们只有为不同的结点指定不同的GetSection()方法了。
而如何进行指定呢?
我们可以写一大串的GetSectionA()、GetSectionB、GetSectionC()让它们分别去对应SectionA、SectionB、SectionC。
但是我们还有更好的方法,我们可以将调用GetSection()时的结点处理逻辑委托给其他的类型去处理,而在哪里指定某个结点由某个委托程序去处理呢?
自然最好还是写在配置文件中。
比如,我们的XML文件是这样的:
?
xmlversion="
1.0"
>
configuration>
forumname="
TraceFact.NetCommunity"
rooturl="
"
/>
replyCount>
20<
/replyCount>
pageSize>
30<
/pageSize>
offlineTime>
/offlineTime>
/forum>
blogname="
JimmyZhang'
sPersonalSpace"
urlMappings>
rewriteRule>
request>
~/(d{4})/Default.aspx<
/request>
sendTo>
~/BlogDetail.aspx?
year=$1<
/sendTo>
/rewriteRule>
/urlMappings>
/blog>
/configuration>
那么,我们要定义对于forum结点和blog结点使用不同的GetSection()方法,我们就可以这么写:
configSections>
sectionname="
forum"
type="
forumSectionHandler"
blog"
blogSectionHandler"
/configSections>
!
--以下为forum和blog结点,省略-->
其中,configSections下的两个section结点分别用于定义对于forum和blog结点使用哪种处理方式。
section结点的name属性说明是对于哪个结点,type属性说明对于该结点用什么程序来处理(当调用GetSection()方法时,会交给type所指定的类型去处理)。
看到这里你应该已经明白了,上面讲述的其实正是.Net中的配置处理方法:
在.Net中,配置文件实际分为了两部分,一部分是配置的实际内容,比如appSettings以及上例中的blog和forum结点;
另一部分指定结点的处理程序,这些结点位于configSections结点下面。
当你打开站点下的web.config文件,你可能看不到太多的configSections下的结点,这是因为诸如AppSettings这样的结点属于内置结点,对于它们的设置全部位于C:
WINDOWSMicrosoft.NETFrameworkv2.0.50727CONFIG下的Machine.Config文件中,以提供全局服务。
(操作系统以及.NetFramework版本不同此目录的地址也不尽相同)。
.Net应用程序配置方法
使用.Net内置结点和.Net内置处理程序
下面我们来一步步地实现.Net中的应用程序配置,首先看下对于.Net中内置的结点如何进行配置以及在程序中进行读取。
创建文件夹GeneralConfig,在文件夹下新建一个站点WebSite,修改Web.Config,删除原有内容,添加如下代码(为了美观,我添加了Theme,进行了简单的样式设定,可以从文章所附的代码中进行下载):
--Basic.aspx,使用.Net内置的结点和处理程序-->
Version"
v1.0.08040301"
GreetingLanguage"
Chinese"
connectionStrings>
removename="
LocalSqlServer"
addname="
LocalServer"
connectionString="
UserID=sa;
Password=password;
InitialCatalog=pubs;
DataSource=."
providerName="
System.Data.SqlClient"
PassportCenter"
DataSource="
/connectionStrings>
--以下配置应用于本范例程序,但不是文章所讨论的范围-->
system.web>
compilationdebug="
true"
pagestheme="
Default"
/system.web>
本节我们演示如何读取appSettings以及ConnectionStrings下的配置数据。
注意到Web.Config中没有configSection结点的设置,也就是并没有定义appSettings结点该如何处理。
如上节所说,这是因为它们的结点处理程序定义在了machine.config中,打开machine.config,我们可以看到这样的设置:
encoding="
UTF-8"
appSettings"
System.Configuration.AppSettingsSection,System.Configuration,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"
restartOnExternalChanges="
false"
requirePermission="
connectionStrings"
System.Configuration.ConnectionStringsSection,System.Configuration,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"
--其余略-->
可以看到,对于appSettings实际上是由System.Configuration.AppSettingsSection处理,而对于connectionStrings实际上是由System.Configuration.ConnectionStringsSection处理。
另外再观察一下machine.config就会发现,处理程序分成了两种类型:
一种是以Section结尾的,比如上面的这两个;
还有一种是以Handler结尾的,比如:
system.data.dataset"
System.Configuration.NameValueFileSectionHandler,System,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089"
可以看到type属性System.Configuration.NameValueFileSectionHandler是以Handler结尾的。
之所以会有这样的区别,是因为.Net中对于结点有两种处理方式,一种是定义一个继承自System.Configuration.ConfigurationSection的类,这也就是以Section结尾的类型;
一种是实现System.Configuration.IConfigurationSectionHandler接口,也就是以Handler结尾的类型。
.NetFramework2.0以后版本推荐采用继承ConfigurationSection类的方式,在本文,范例大多数使用实现IConfigurationSectionHandler接口的方式,下面也会提供一个继承ConfigurationSection类的方式作为对比。
NOTE:
使用私有程序集时type通常由两部分组成,由逗号“,”分隔,前半部分是类型名称,后半部分是程序集名称。
如果是公有程序集(GAC),则需要提供publicKey。
好了,现在我们看一下如何在程序中读取它们。
添加一个文件Basic.aspx,修改它的代码如下(只含主要代码,下同):
//Basic.aspx
h2>
WebsiteInformation:
/h2>
hr/>
b>
WebsiteName<
/b>
:
asp:
LiteralID="
ltrSiteName"
runat="
server"
/asp:
Literal>
br/>
Version<
:
ltrVersion"
LocalServerConnection<
:
ltrLocalConnection"
//Basic.aspx.cs
protectedvoidPage_Load(objectsender,EventArgse)
{
stringsiteName=ConfigurationManager.AppSettings["
stringversion=ConfigurationManager.AppSettings["
stringlocalConnection=ConfigurationManager.ConnectionStrings["
].ConnectionString;
ltrSiteName.Text=siteName;
ltrVersion.Text=version;
ltrLocalConnection.Text=localConnection;
在浏览器中浏览,应该可以看到这样的界面:
使用自定义结点和.Net内置处理程序
在上一节,我们使用了.Net内置的结点appSettings和connectionStrings结点,并使用了.Net内置的处理程序。
.Net内置的处理程序定义于machine.config中,提供全局服务,所以我们无需进行任何额外工作就可以直接使用。
但是使用内置结点在很多情况下不一定方便,比如说,我们希望保存站点使用的邮件服务器的地址、用户名和密码,那么按照上面的做法,我想应该是这样的:
MailServer"
MailUser"
jimmyzhang"
MailPassword"
123456"
这样的话配置及使用并不方便:
首先,很明显这三个add是一组数据,但是除了凭自己的经验判断,再没有任何办法进行区分;
其次,如果我们有多组服务器或者很多配置,我们需要写很长的add结点。
如果我们可以自定一个结点,情况就会好很多,比如我们在Web.Config中添加一个结点:
mailServeraddress="
userName="
password="
这样看起来就好了很多,mailServer表示这是一个关于邮件服务器配置的结点,它的属性/值分别代表存储的相应的值。
以后我们在程序中进行发送邮件时可以根据这里的值来对发送邮件的对象进行参数设置。
本节我们就来看下如何在web.Config中使用我们自定义的结点,但使用.Net内置的处理程序。
在web.config中,结点以及属性的命名遵循Camel命名方式,也就是首字母小写,其后的每个单词首字母大些的方式。
接着在站点中添加一个Simple.aspx文件,打开它。
此时编译器会报错,提示:
“分析器错误信息:
无法识别的配置节mailServer”。
.Net已经提供了很多内置的处理程序,为了避免发生这个错误,我们必须在configSection中指定对mailServer结点的处理程序。
有时候我们希望绕过.Net的机制,直接使用System.Xml命名空间下的类来对配置文件(web.config也是标准的Xml文件)进行操作,但是因为这里会报错,所以有的人干脆就另建一个xml文件了事,然后对新建的xml文件进行操作。
实际上,可以通过指定IgnoreSectionHandler或者IgnoreSection处理程序的方式来进行处理,如同它们的名称所暗示的,这两个处理程序什么都不做,仅仅是让.Net忽略我们的自定义结点。
修改web.Config,在根节点configuration下创建configSections结点,然后再添加一个section结点,指定它的name属性值为mailServer,意为指定mailServer结点的处理程序,然后指定type为System.Configuration.IgnoreSection:
--使用IgnoreSection,可以将指定的XMl结点忽视掉-->
mailServer"
System.Configuration.IgnoreSection,System.Configuration,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"
allowLocation="
--自定义结点mailServer-->
此时再次打开Simple.aspx,编译器不再报错,由于我们什么内容也没有添加,此时会显示一个空白页面。
现在,你可以采用“老办法”,编写程序去处理这个结点了,但是本文要讲述的,是一种更优雅、更.Net的方式。
在本节,我们暂且不自定义处理程序,看看.Net中除了这个IgnoreSectionHandler还有什么可以利用的处理程序。
在.Net中,还有一个较为常用的处理程序,就是System.Configuration.SingleTagSectionHandler,它会以Hashtable的形式返回结点的所有属性。
现在我们将上面定义的configSections结点下name属性为mailServer的section结点的type属性改为System.Configuration.SingleTagSectionHandler:
--对自定义结点mailServer定义处理程序,使用.Net内置的处理程序-->
System.Configuration.SingleTagSectionHandler,System,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089"
然后,修改simple.aspx文件,代码如下所示:
//Simple.aspx
div>
h1>
使用自定义结点和.Net内置处理程序<
/h1>
MailServerInformation:
Address<
ltrAddress"
UserName<
ltrUserName"
Password<
ltrPassword"
/div>
//Simple.aspx.cs
//返回一个Hashtable
HashtablemailServer=(Hashtable)ConfigurationManager.GetSection("
);
ltrAddress.Text=mailServer["
address"
].ToString();
ltrUserName.Text=mailServer["
userName"
ltrPassword.Text=mailSe