网站重构之配置文件分解
最近赶上公司重构网站,架构组的同事为提高web部门的开发效率,总结出了一些不错的经验,本人也是直接受益者,为此用下面几篇文章来与大家分享。
这一篇,我想讨论的是网站配置文件问题。说到配置文件,我第一印象就是它的灵活性,传统的做法就是在web.config中写配置,然后在.net中可以通过ConfigurationManager .AppSettings 方法读取。最大的好处就是本机测试环境和正式上线的环境可以采用不同的配置。最常见的要数数据库连接串。
web.config中写配置的缺点:
1:每次修改配置文件都需要重启IIS。
更正:谢谢@心太@生鱼片的提醒,修改配置文件不会重启IIS,但对应的站点会重启。
2:所有的配置都写在一个文件中,不方便查阅及修改。
3:修改web.config有非常大的风险,往往一个小地方配置出错,就会导致全站无法访问。
之前我写过一篇关于如何把配置文件写在独立文件中的文章(如何分割web.config)。那篇文章只是提到了如何分解配置文件,但有的项目配置项往往会特别多,这样即使文件从web.config中分离出来了,但查询的修改的缺点还是没有解决。为此我们可以根据网站的功能点来分解配置文件。
从环境概念上分解web.config:有些配置文件在上线时是需要修改的,例如数据库连接串等,有些配置文件可以跟应用程序一样,直接复制过去就行。这里先贴下网站对于web.config的分解图:
第一:网页各自的meta参数配置。每个页面都有自己的标题,meta,这些就是为了增加用户体验以及seo。如果每个页面都去写这样的代码,我想程序员都不喜欢做这种无聊的事,这里我们可以创建一个ChannelPageConfig.config。每个节点包含了页面的title,meta等信息。
<Meta type="SiteCn" title="网页标题" key="关键字" description="页面描述" />
</Page>
客户端调用:我们可以利用母版页,在母版页中通过程序来加载这些页面元素内容。
<meta name="keywords" content="<%= ViewData["m_keywords"] %>" />
<meta name="description" content="<%= ViewData["m_description"] %>" />
第二:广告的配置。网站往往都会或多或少的加入一些广告,广告内容大多都是一些链接,为此我们创建ChannelAdsConfig.config来统一管理所有页面的广告。
<url><![CDATA[/list_cn/]]></url>
<AdsArea name="HeaderAds">广告具体内容</AdsArea>
</AdsArea>
</Page>
代码说明:
1:节点url,页面链接中包含指定字符的页面。程序员可以通过配置url来指定下面的广告被哪一个页面加载。
2:节点AdsArea,广告容器,它是页面中一个指定id的html元素。例如div,span等等。
第三:CMS管理。很多网站都有自己的CMS管理系统,CMS一旦多了,管理起来也是一件头疼的事情。我里由ChannelCmsConfig.config统一管理。
<Region id="1">
<Site WebCategory="bbs" Language="CN"><![CDATA[cms.xml]]></Site>
<Site WebCategory="bbs" Language="EN"><![CDATA[cms.xml]]></Site>
</Region>
</CmsArea>
节点说明:
1:CmsArea,代表一个区域,例如我们指定首页的CMS区域名称为index。
2:Region,页面中的具体区域,例如左侧,右侧等等。
3:Site,主要是实现多语言站点的CMS,通过Language标识。
第四:站点url管理。在网站编码中,经常会跳转到其它页面去,一般我们都会直接转向到具体链接,但有时,这些链接会发生变化,如果链接写在代码中,维护起来就是大问题。而且链接在统一的地方维护,这样在多人同时调用时,就不会出现链接不统一的情况。 我们可以把这些需要程序拼接的动态链接管理起来。ChannelSiteUrlConfig.config实现这一功能。
节点非常简单,path用来配置链接,在链接中如果有参数,我们可以用{索引}来代替,程序调用时,利用String.Format来完成参数的替换。
客户端调用:通过xml文件中的url节点的name关键字来查询。
第五:其它配置。上面的配置文件都是针对一类业务,但有些配置文件往往不会有这样强的业务区域,有些配置只是程序的需求。例如搜索酒店时,我们最大让用户搜索近半年的酒店,这个最大数就可以配置在ChannelConfig.config中。
<Items>
<item key="AfterDays">180</item>
</Items>
</ChannelConfig>
客户端调用:通过item的key来取值。也可以通过反序列化方式实现读取,不过如果节点比较多的话,实现起来也挺麻烦的,因为每增加一个节点,就需要在对应的类中增加相应的属性。
总结:本文总结了大部分的配置文件分解,其它的可以根据自己项目的实际情况来分。通过功能的划分,我们现在已经非常容易查找及修改配置节了,在编码上也会提高效率。