数据访问层DAL的再次重构_2_模块的自定义设置节
接着数据访问层DAL的再次重构_1_建库表存储过程,数据库的连接串随着将来移植的问题而变化,所以在web.config中我们使用<connectionStrings>节点来保存该设置,为了以后便于维护这方面。
上一篇已经说明了(观察aspnetdb.mdf得到的启发),对于网站而言,提升网站的性能那么缓存将是非常重要的功能。
数据缓存自然是不可或缺的。三层体系中的层次很明白了。我们希望DAL层能够支持缓存、设置缓存有效时间(以秒为单位)、以及对数据库连接串的正确访问。那么这些设置我们使用web.config的自定义配置节点来设置。(可能有人会提议用web.config的<appSettings>节点来保存,但是如果网站的多个模块<每个模块都有自己独立的设置>都放在这里,显得很混乱,命名上有可能冲突,尤其是不同人开发不同模块时,命名可能存在相同问题)
我们先看看已经实现好了的情况:
我们首先定义了一个节点名称myWebSite,它的子元素polls(对应代码PollsElement)里面的属性:archiveIsPublic/votingLockByIP/connectionStringName(它的名称来自前面的设置连接串)。
对于民意调查模块,我们前面分析过:归档的民意是否显示给网站所有人浏览(还是网站的注册用户才能浏览)[ArchiveIsPublic],
民意的选项投票是用cookie来存储而避免重复锁定(votingLockByCookie)还是使用Ip锁定(votingLockByIP),所以我们先设置PollsElement元素
如何与web.config中的<polls>对应,其实可以看到[ConfigurationProperty]这个设置。
注意:这里由于是新建网站的方式,所以代码的类并没有放在命名空间中,但是我们还是养成良好的习惯,通过命名空间来组织相关的类。所以上图中红色框框部分我增加了一个命名空间MyWebSite。<polls>节点的父节点<myWebSite>,通过代码来访问是WebConfigurationManager.GetSection("myWebSite") 。
该方法的“myWebSite”是必须与web.config中的 声明相匹配的。
我们建立静态类Global.cs代码如下:
那么以后读取<polls>相关属性的值,用代码的访问方式:
首先必须在web.config中有<myWebSite>的定义和其下子节点<polls>的相关设置,否则报空引用异常。
app_code/ConfigSection.cs代码如下:
1 using System;
2 using System.Collections.Generic;
3 using System.Web;
4 using System.Configuration;
5 using System.Web.Configuration;
6 namespace MyWebSite
7 {
8 /// <summary>
9 ///用来设置保存在Web.config的自定义节点和元素
10 /// </summary>
11 public class ConfigSection : ConfigurationSection
12 {
13 [ConfigurationProperty("polls",IsRequired=true)]
14 public PollsElement Polls //民意调查模块的配置节
15 {
16 get { return (PollsElement)base["polls"]; }
17 }
18 }
19
20 //通常网站分为多个模块,而每个模块下都有属性connectionStringName,EnableCaching,CacheDuration,ProviderType
21
22 //通常情况下这表示某个具体模块[民意调查模块]的通用配置,注意自己特有的属性配置(IP/Cookie锁定投票、归档文档是否全开放)
23 public class PollsElement : ConfigurationElement
24 {
25 [ConfigurationProperty("connectionStringName",IsRequired=true)]
26 public string ConnectionStringName
27 {
28 get{return (string)base["connectionStringName"];}
29 set{base["connectionStringName"]=value;}
30 }
31
32 //WebConfigurationManager.ConnectionStrings与ConfigurationManager.ConnectionStrings区别是什么?
33 /// <summary>
34 /// 获取数据库连接串
35 /// </summary>
36 public string ConnectionString
37 {
38 get {
39 return WebConfigurationManager.ConnectionStrings[ConnectionStringName].ConnectionString;
40 }
41 }
42
43 /// <summary>
44 /// 实际的数据提供程序子类(真正的底层数据访问)
45 /// </summary>
46 //[ConfigurationProperty("providerType",IsRequired=true)]
47 [ConfigurationProperty("providerType",DefaultValue="DAL.SqlClient.SqlPollsProvider")]
48 public string ProviderType
49 { get { return (string)base["providerType"]; } set { base["providerType"] = value; } }
50
51 /// <summary>
52 /// 是否支持缓存
53 /// </summary>
54 [ConfigurationProperty("enableCaching",DefaultValue=true)]
55 public bool EnableCaching
56 { get { return (bool)base["enableCaching"]; } set { base["enableCaching"] = value; } }
57
58 /// <summary>
59 /// 缓存的时间(秒)
60 /// </summary>
61 [ConfigurationProperty("cacheDuration",DefaultValue=15)]
62 public int CacheDuration
63 {
64 get { return (int)base["cacheDuration"]; }
65 set { base["cacheDuration"] = value; }
66 }
67
68 /// <summary>
69 /// 是否参与投票通过cookie来保存锁定,以免重复投票
70 /// </summary>
71 [ConfigurationProperty("votingLockByCookie",DefaultValue="true")]
72 public bool VotingLockByCookie
73 {
74 get { return (bool)base["votingLockByCookie"]; }
75 set { base["votingLockByCookie"] = value; }
76 }
77
78 /// <summary>
79 /// 是否参与投票通过Ip来保存锁定,以免重复投票
80 /// </summary>
81 [ConfigurationProperty("votingLockByIP", DefaultValue = "true")]
82 public bool VotingLockByIP
83 {
84 get { return (bool)base["votingLockByIP"]; }
85 set { base["votingLockByIP"] = value; }
86 }
87
88 /// <summary>
89 /// 归档的民意调查是否对所有人开放(默认只有注册的用户才能看到归档的民意调查)
90 /// </summary>
91 [ConfigurationProperty("archiveIsPublic",DefaultValue=false)]
92 public bool ArchiveIsPublic
93 {
94 get { return (bool)base["archiveIsPublic"]; }
95 set { base["archiveIsPublic"] = value; }
96 }
97 }
98 }
当来之世,经道灭尽,我以慈悲哀愍,特留此经止住百岁。其有众生,值斯经者,随意所愿,皆可得度。(南无阿弥陀佛)
道可道,非常道;名可名,非常名。
我常说,一个国家,一个民族,亡国都不怕,最可怕的是一个国 家和民族自己的根本文化亡掉了,这就会沦为万劫不复,永远不会翻身。---南怀瑾<国学大师>