仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 737|回复: 8
打印 上一主题 下一主题

[学习教程] ASP.NET教程之.NET 2.0 中的自界说设置处置

[复制链接]
柔情似水 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:45:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
c++是语言,其实C++和java的应用范围根本就不一样的。在java应用的领域内,c++是不合适的。所以微软才搞了C#和Java对抗。  弁言

  古代软件开辟中,各类手艺、技能愈来愈依附设置,比如客户端对用户体验的本性化设置、体系的各类运转时参数设置、可插拔的插件机制、基于设置的IoC架构形式等。设置体例也从最后的二进制存储格局慢慢过分到INI文本格局直至今时所普遍利用的Xml格局。利用Xml格局举行设置,年夜年夜进步了对设置数据的体现才能,可是在.NET1.x中对Xml设置的操控另有诸多方便,特别是对Xml设置的存储同步机制很不完美,而从.NET2.0入手下手,框架供应了更丰厚和易于操控利用的机制。

  .NET中的设置文件(Xml)必需以“<configuration>”为根节点,设置文件分为两年夜部分:设置声明区和数据设置区。

  设置声明区:位于<configuration><configSections>内,经由过程<section>节点举行声明界说。

  数据设置区:位于<configuration>根节点内除<configSections>之外的恣意节点。

  数据设置区能够是用户界说的恣意布局条理,可是其“根节点”必需事后在设置声明区界说,运转时会举行无效性检测,一旦发明没有声明的设置节点则会发生一个运转时设置非常。

  典范设置文件

<configuration>
<configSections>
<sectionname="dataSystems"type="SWSystem.Data.Configuration.DataSystemsSection,SWSystem.Data"/>
</configSections>

<dataSystems>
<dataSystemname="iMRP"currentProvider="SQLProvider">
<dataProvidername="MSSqlProvider"type="SWSystem.Data.Providers.SQLDataProvider"dataFile="D:ongsoftDevelop2005SWSystem.DataServicesSWDataEngine.xml"connectionString="UID=sa;PWD=;InitialCatalog=iMRP;DataSource=127.0.0.1"/>
<dataProvidername="PostgreSqlProvider"type="SWSystem.Data.Providers.PostgreDataProvider"dataFile="D:ongsoftDevelop2005SWSystem.DataServicesSWDataEngine.xml"connectionString="Server=127.0.0.1;Port=5432;UserId=postgres;Password=postgres;Database=iMRP;Encoding=UNICODE;"/>

<dataModules>
<addname="StockModule"type="Zongsoft.Applications.iMRP.Business.StockModule,Zongsoft.Applications.iMRP.Business"/>
</dataModules>
</dataSystem>
</dataSystems>
</configuration>
  概述

  在.NET2.0中完成自界说设置,可使用编程或声明性(属性化)代码编写模子创立自界说设置节。

  编程模子。此模子请求为每一个节属性(Attribute)创立一个用于猎取和/或设置其值的属性(Property),并将其增加到基本ConfigurationElement基类的外部属性(Property)包中。

  声明模子。这类对照复杂的模子也称为属性(Attribute)化模子,同意您经由过程利用属性(Property)来界说节属性(Attribute),并利用属性(Attribute)对其举行润色。

  设置文件中的元素称为基础XML元素或节。基础元素只是具有相干属性(假如有)的复杂XML标志。节最复杂的情势与基础元素分歧。而庞大的节能够包含一个或多个基础元素、元素的汇合和其他节。

  ConfigurationProperty类暗示设置节点中的特征(Attribute)或它的子元素,我们要做的就是经由过程ConfigurationProperty类将设置实体类中的属性(Property)映照到对应的节点特征(Attribute)。
<P>  设置声明

  要在设置文件中利用自界说的设置数据,必需在声明区经由过程<section>节点对自界说设置节处置程序举行声明,该节点有两个必须属性:name和type。

  name属性:指定与type属性中指定的设置节处置程序联系关系的设置节或元素的称号。这是该元素在设置文件的设置区中利用的称号。

  type属性:指定用来处置name属性所指定的设置节的处置程序。利用以下格局:
type="ConfigurationSectionHandlerClass,AssemblyFileName,Version,Culture,PublicKeyToken"
假如对处置程序的版本没请求,大概其为无地区和强署名的程序集,则能够省略前面的三项,不然必需严厉婚配版本。注重:程序集文件名不要带其扩大文件名(一般为.dll)。

  典范设置文件中的设置声明界说如:<sectionname="dataSystems" type="SWSystem.Data.Configuration.DataSystemsSection,SWSystem.Data"/>则暗示数据设置区中的<dataSystems>节点由SWSystem.Data.Configuration.DataSystemsSection类举行处置,而且该类位于SWSystem.Data程序会合。

  在.NET1.x中要完成自界说的设置处置程序类,其必需完成IConfigurationSectionHandler接口,如今.NET2.0中只必要将你的处置程序类承继自ConfigurationSection类便可。其处置步骤大抵以下:

  起首界说并创立一个ConfigurationPropertyCollection类的实例,用以保留设置节点的特征(Attribute)和它的一切子元素映照,固然你也能够利用ConfigurationElement基类中的Properties属性。

  然后创立ConfigurationProperty类以映照到对应的节点特征(Attribute)或子元素。

  在范例机关函数或实例机关函数中,将创立的ConfigurationProperty类实例到场到已创立好的ConfigurationPropertyCollection汇合中。

  终极,我们的典范设置处置程序类看起来多是如许(假如你利用声明形式则代码看起来没有这么贫苦,这些设置属性类将由框架运转时帮你反射天生,正由于云云,以是它的运转时效力要差些。):

publicclassDataSystemsSection:ConfigurationSection
{
 privatestaticreadonlyConfigurationProperty_dataSystems=newConfigurationProperty(null,typeof(DataSystemElementCollection),null,ConfigurationPropertyOptions.IsDefaultCollection);
 privatestaticConfigurationPropertyCollection_properties=newConfigurationPropertyCollection();

 staticDataSystemsSection()
 {
  _properties.Add(_dataSystems);
 }

 publicDataSystemElementCollectionDataSystems
 {
  get
  {
   return(DataSystemElementCollection)base[_dataSystems];
  }
 }

 protectedoverrideConfigurationPropertyCollectionProperties
 {
  get
  {
   return_properties;
  }
 }
}
  节点映照/设置实体

  为一切的设置节点创立对应的设置实体类,该类中的属性(Property)对应节点中的特征(Attribute)和子元素(汇合)。其编写步骤和开辟体例与处置程序相似,只是这时候我们的基类酿成了ConfigurationElement。

publicclassDataSystemElement:ConfigurationElement
{
 privatestaticreadonlyConfigurationProperty_name=newConfigurationProperty("name",typeof(string),null,null,newStringValidator(1),ConfigurationPropertyOptions.IsKey|ConfigurationPropertyOptions.IsRequired);
 privatestaticreadonlyConfigurationProperty_currentProvider=newConfigurationProperty("currentProvider",typeof(string),string.Empty,ConfigurationPropertyOptions.IsRequired);
 privatestaticreadonlyConfigurationProperty_dataModules=newConfigurationProperty("dataModules",typeof(DataModuleElementCollection),null,ConfigurationPropertyOptions.None);
 privatestaticreadonlyConfigurationProperty_dataProviders=newConfigurationProperty(null,typeof(DataProviderElementCollection),null,ConfigurationPropertyOptions.IsRequired|ConfigurationPropertyOptions.IsDefaultCollection);

 privatestaticConfigurationPropertyCollection_properties=newConfigurationPropertyCollection();

 #region范例机关函数
 staticDataSystemElement()
 {
  _properties.Add(_name);
  _properties.Add(_currentProvider);
  _properties.Add(_dataProviders);
  _properties.Add(_dataModules);
 }
 #endregion

 #region机关函数
 publicDataSystemElement()
 {}

 publicDataSystemElement(stringname)
 {
  this.Name=name;
 }

 publicDataSystemElement(stringname,stringcurrentProvider)
 {
  this.Name=name;
  this.CurrentProviderName=currentProvider;
 }
 #endregion

 #region大众属性
 publicstringName
 {
  get
  {
   return(string)base[_name];
  }
  set
  {
   base[_name]=value;
  }
 }

 publicStringCurrentProviderName
 {
  get
  {
   return(string)this[_currentProvider];
  }
  set
  {
   this[_currentProvider]=value;
  }
 }

 publicDataModuleElementCollectionDataModules
 {
  get
  {
   return(DataModuleElementCollection)base[_dataModules];
  }
 }

 publicDataProviderElementCollectionDataProviders
 {
  get
  {
   return(DataProviderElementCollection)base[_dataProviders];
  }
 }
 #endregion
}
  必要注重的是,<dataProvider>和<dataModules>子元素处置体例的差别。

  <dataModules>是个嵌套的汇合节点,它上面有尺度的<add>,<remove>,<clear>子元素,且<dataModules>元素不克不及在统一个<dataSystem>节点下呈现屡次。

  <dataProvider>是<dataSystem>节点下的间接子节点汇合,<dataProvider>是能够在统一个父节点下呈现屡次的汇合项节点,故必要对其映照的ConfigurationProperty类机关函数中的options参数包括ConfigurationPropertyOptions.IsDefaultCollection列举项(它唆使.NET框架机关一个嵌套节),别的,不克不及指定它对应的设置节点的名字,即必需坚持机关函数中name参数的值为空援用([C#]null/[VB.net]Nothing)或空字符串(String.Empty/"")。
<P>  节点汇合

  创立派生自ConfigurationElementCollection的类,在派生类中必需重写(override)的笼统办法:

protectedabstractConfigurationElementCreateNewElement()
  在从设置文件加载汇合时,会挪用该办法以创立各个元素。重写该办法以创立特定范例的自界说ConfigurationElement工具。

protectedabstractobjectGetElementKey(ConfigurationElementelement)
  在派生类中重写时猎取指定设置元素的键值。

  关于非默许的节点汇合类,还必需重写CollectionType和ElementName只读属性的getter,其代码大概以下:

protectedoverridestringElementName
{
 get
 {
  return"dataProvider";//"dataProvider"replacewithyourelementNameincollection.
 }
}

publicoverrideConfigurationElementCollectionTypeCollectionType
{
 get
 {
  returnConfigurationElementCollectionType.BasicMap;
 }
}
  能够重写ThrowOnDuplicate只读属性的getter,以唆使当向ConfigurationElementCollection增加反复的ConfigurationElement是不是会招致激发非常。默许情形,只要当该元素的CollectionType值为AddRemoveClearMap或AddRemoveClearMapAlternate时才会激发非常,假如但愿非默许节点汇合不承受反复项(一般云云),那末就必需重写该属性的getter,一直前往真(true)。

  请注重,键和值都不异的元素不会被视为反复元素,而是承受此类元素且不呈现提醒,只要键不异而值分歧的元素才被视为是反复元素。缘故原由是这些元素不会举行合作。可是,没法增加键不异而值分歧的元素,由于没法从逻辑上断定哪一个合作值无效。

  索引器的计划形式

  一般必要界说索引器的两个重载(overloads),一个承受整型数下标的可读写的索引器;一个是承受字符串键值的只读索引器。

publicDataProviderElementthis[intindex]
{
 get
 {
  return(DataProviderElement)BaseGet(index);
 }
 set
 {
  if(BaseGet(index)!=null)
   BaseRemoveAt(index);

  BaseAdd(index,value);
 }
}

publicnewDataProviderElementthis[stringname]
{
 get
 {
  return(DataProviderElement)BaseGet(name);
 }
}
  其他事项

  一般还必要公然一些对汇合操纵的办法,大抵以下:

publicintIndexOf(DataProviderElementvalue)
{
 returnBaseIndexOf(value);
}

publicvoidAdd(DataProviderElementvalue)
{
 BaseAdd(value);
}

publicvoidRemove(DataProviderElementvalue)
{
 if(BaseIndexOf(value)>=0)
  BaseRemove(value.Name);
}

publicvoidRemove(stringname)
{
 BaseRemove(name);
}

publicvoidRemoveAt(intindex)
{
 BaseRemoveAt(index);
}

publicvoidClear()
{
 BaseClear();
}
  总结

  这只是我想要撰写的有关.NET2.0中的基本手艺篇文章中的第一篇。在这篇文章中,我先容了有关设置方面的一些基础观点,并论述了在.NET2.0中怎样定制你本人的设置处置程序,和这过程当中必要注重的一些细节成绩。您已看到,经由过程对.NET2.0中供应的基本架构的扩大,我们能够很简单完成特征化的设置定制。我感觉可以顶到50楼,出乎意料的是大家居然纷纷写出自己的博文,还被编辑做成了专题,置于首页头条。
莫相离 该用户已被删除
沙发
发表于 2015-1-19 09:52:22 | 只看该作者
Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。
飘灵儿 该用户已被删除
板凳
发表于 2015-1-24 12:06:47 | 只看该作者
CGI程序在运行的时候,首先是客户向服务器上的CGI程序发送一个请求,服务器接收到客户的请求后,就会打开一个新的Process(进程)来执行CGI程序,处理客户的请求。CGI程序最后将执行的结果(HTML页面代码)传回给客户。
不帅 该用户已被删除
地板
发表于 2015-2-1 10:09:28 | 只看该作者
现在主流的网站开发语言无外乎asp、php、asp.net、jsp等。
若相依 该用户已被删除
5#
发表于 2015-2-7 02:58:37 | 只看该作者
在一个项目中谁敢保证每天几千万甚至几亿条的数据不丢失?谁敢保证应用的高可靠性?有可以借签的项目吗?
谁可相欹 该用户已被删除
6#
发表于 2015-2-19 23:25:31 | 只看该作者
通过这次激烈的讨论,我从大家身上学到了太多,开阔了眼界,不管是支持我的还是骂我的,都感谢你们。
活着的死人 该用户已被删除
7#
发表于 2015-3-6 15:54:14 | 只看该作者
这也就是最近几年来随着各种新的后台技术的诞生,CGI应用在Internet上越来越少的原因。CGI方式不适合大访问量的应用。
柔情似水 该用户已被删除
8#
 楼主| 发表于 2015-3-13 04:08:25 | 只看该作者
主流网站开发语言之ASP:ASP是微软(Microsoft)所开发的一种后台脚本语言,它的语法和VisualBASIC类似,可以像SSI(ServerSideInclude)那样把后台脚本代码内嵌到HTML页面中。虽然ASP简单易用,但是它自身存在着许多缺陷,最重要的就是安全性问题。
飘飘悠悠 该用户已被删除
9#
发表于 2015-3-20 12:10:40 | 只看该作者
业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 13:51

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表