手把手教你写ORM(三)
昨天处于晕死状态,少写了一个组件,还需要一个组件用来专门管理Cache的,这里说道为什么要分这么多组件,其实这是习惯问题,很多人喜欢写一个很大的DLL,不过我比较喜欢拆分,小粒度的项目比较好管理和单独测试,把用单元测试验证好了的小组件凑起来调试和写成一个巨大的DLL慢慢一行行的追踪代码,肯定是前者更加舒心和满足懒汉的要求。
之前说了,今天主要将实现Yourname.Config这个项目,这个项目用来管理所有的配置文件,把所有的配置文件Cache到内存,并且需要在配置文件更新的时候刷新内存中的配置数据。
这里如何在内存存储这些配置文件是小问题,用HashTable就能解决了,Key用文件的Path,Value就是文件的内容了。
这里我们建立一个Resource类,用来处理这些配置资源
这里的代码已经具备了基本功能了,不过最好在Add前先检测以下项是否存在最好。
这样子,当我们去new Resource的时候一个配置文件就加载到了HashTable里面了。
这个时候我们不用每一次需要配置的时候都去读取文件,不过占用了内存,典型的空间换时间的方法。
不过现在还有一个问题,就是如果在运行的时候,如果,我们修改了配置文件的话,由于加载到了内存,我们的修改不会马上体现到程序里,必须重新启动程序才行,对于Web来说,重新启动IIS站点是没有用的,必须重起服务。
这是一个问题
怎么获取一个文件是否修改了呢?我们可以通过比对文件的最后修改时间的属性来解决。
在这里,我们在第一次加载一个配置文件的时候记录其最后修改时间,然后在以后每一次new的时候都去检查一次文件的最后修改时间和记录的是否相等,如果不相等,就说明文件被修改过了,于是就重新加载文件,这样子就能够实现即时刷新配置了
这里我们为了记录文件的最后修改时间,再添加一个HashTable,还是用Path作Key,Value就是文件的最后修改时间了
具体代码:
这里很多的判断阿容错阿这些我都没做,也没有用现成项目的现成源代码,都是些此文时现用记事本手写的,如果有错请见谅阿。
这里我们就可以通过 Resource rc=new Resource("xxx.xml"); rc.Configs["xx.xml"];来获取XML的配置内容了,但是这样子还不是最终的版本,我们需要通过类名就能获取他的配置,还有就是光有配置的XML还不行,我们还需要从XML里面分析出配置的内容才行,这些都是下一步我们来实现的东西
to be continue......
之前说了,今天主要将实现Yourname.Config这个项目,这个项目用来管理所有的配置文件,把所有的配置文件Cache到内存,并且需要在配置文件更新的时候刷新内存中的配置数据。
这里如何在内存存储这些配置文件是小问题,用HashTable就能解决了,Key用文件的Path,Value就是文件的内容了。
这里我们建立一个Resource类,用来处理这些配置资源
1class Resource
2{
3 private static HashTable _configfile=new HashTable();
4 public HashTable Configs
5 {
6 get{return _configfile;}
7 }
8 public Resource(string Path)
9 {
10 StreamReader readfile=new StreamReader(Path);
11 using(readfile)
12 {
13 _configfile.Add(Path,readfile.ReadToEnd());
14 readfile.Close();
15 }
16 }
17
18}
2{
3 private static HashTable _configfile=new HashTable();
4 public HashTable Configs
5 {
6 get{return _configfile;}
7 }
8 public Resource(string Path)
9 {
10 StreamReader readfile=new StreamReader(Path);
11 using(readfile)
12 {
13 _configfile.Add(Path,readfile.ReadToEnd());
14 readfile.Close();
15 }
16 }
17
18}
这里的代码已经具备了基本功能了,不过最好在Add前先检测以下项是否存在最好。
这样子,当我们去new Resource的时候一个配置文件就加载到了HashTable里面了。
这个时候我们不用每一次需要配置的时候都去读取文件,不过占用了内存,典型的空间换时间的方法。
不过现在还有一个问题,就是如果在运行的时候,如果,我们修改了配置文件的话,由于加载到了内存,我们的修改不会马上体现到程序里,必须重新启动程序才行,对于Web来说,重新启动IIS站点是没有用的,必须重起服务。
这是一个问题
怎么获取一个文件是否修改了呢?我们可以通过比对文件的最后修改时间的属性来解决。
在这里,我们在第一次加载一个配置文件的时候记录其最后修改时间,然后在以后每一次new的时候都去检查一次文件的最后修改时间和记录的是否相等,如果不相等,就说明文件被修改过了,于是就重新加载文件,这样子就能够实现即时刷新配置了
这里我们为了记录文件的最后修改时间,再添加一个HashTable,还是用Path作Key,Value就是文件的最后修改时间了
具体代码:
1class Resource
2{
3 private static HashTable _configfile=new HashTable();
4 private static HashTable _configtime=new HashTable();
5 public HashTable Configs
6 {
7 get{return _configfile;}
8 }
9 public Resource(string Path)
10 {
11 if(!File(Path).GetLastEditTime().Equles((DateTime)_configtime[Path]))
12 {
13 StreamReader readfile=new StreamReader(Path);
14 using(readfile)
15 {
16 _configfile.Add(Path,readfile.ReadToEnd());
17 readfile.Close();
18 _configtime.Add(Path,File(Path).GetLastEditTime());
19 }
20 }
21 }
22
23}
2{
3 private static HashTable _configfile=new HashTable();
4 private static HashTable _configtime=new HashTable();
5 public HashTable Configs
6 {
7 get{return _configfile;}
8 }
9 public Resource(string Path)
10 {
11 if(!File(Path).GetLastEditTime().Equles((DateTime)_configtime[Path]))
12 {
13 StreamReader readfile=new StreamReader(Path);
14 using(readfile)
15 {
16 _configfile.Add(Path,readfile.ReadToEnd());
17 readfile.Close();
18 _configtime.Add(Path,File(Path).GetLastEditTime());
19 }
20 }
21 }
22
23}
这里很多的判断阿容错阿这些我都没做,也没有用现成项目的现成源代码,都是些此文时现用记事本手写的,如果有错请见谅阿。
这里我们就可以通过 Resource rc=new Resource("xxx.xml"); rc.Configs["xx.xml"];来获取XML的配置内容了,但是这样子还不是最终的版本,我们需要通过类名就能获取他的配置,还有就是光有配置的XML还不行,我们还需要从XML里面分析出配置的内容才行,这些都是下一步我们来实现的东西
to be continue......