现在中午不睡一会儿就头晕。
前一篇有人留言说为什么不写web.config?我个人非常反对庞大的web.config文件,可能其根源就在于互联星空系统的巨大的配置和它带来的混乱,自己实现一个小巧灵活的机制是我比较喜欢的,这样可以降低系统的侵入性,也可以方便我改成其他语言的版本。
这里我们来给刚才的Resource类加一个壳,因为我们毕竟不能用绝对的Path去访问,我们需要一个通过类名就可以访问得到配置的方式。
在加这个壳之前我们先规划一下配置文件,我们这里需要两种配置文件,一个是配置数据库连接的,一种是配置每个类的操作的,前边说过了,对输入和结果的映射在类的Attribute里完成,这样子配置每个类的配置文件就可以相当的简单了
数据库连接配置文件:
<?
xml version
=
"
1.0
"
encoding
=
"
utf-8
"
?>
<
config
>
<
session name
=
"
test
"
>
<
connectionstring
>
Data Source
=
.\SQLEXPRESS;AttachDbFilename
=
"
C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\test.mdf
"
;Integrated Security
=
True;Connect Timeout
=
30
;User Instance
=
True
</
connectionstring
>
<
assambly
>
Alexander.Xbase.SqlExec
</
assambly
>
<
provider
>
Alexander.Xbase.SqlExec.Exec
</
provider
>
<
configbase
>
D:\MyDocuments\Visual Studio
2005
\Projects\Alexander\Xbase\MenTest\bin\Debug\
</
configbase
>
</
session
>
</
config
>
每个Session配置一个数据库连接,configbase是用来指定这个连接的配置文件所在的目录,以后获取每个类的配置文件就在这个配置项的值所在的目录里面。数据库配置文件在System.AppDomain.CurrentDomain.BaseDirectory里面搜索,不用配置
每个类的配置文件:
<?
xml version
=
"
1.0
"
encoding
=
"
utf-8
"
?>
<
class
>
<
sql name
=
"
insert
"
>
insert into tb (aaa,bbb) values (#aaa,#bbb)
</
sql
>
<
sql name
=
"
getall
"
cache
=
"
true
"
>
select
*
from tb
</
sql
>
</
class
>
Sql节配置SQL指令,参数用#开头,属性Cache指示这个查询是否被缓存
我们需要两个类来分别表示这两种配置文件来提供对其的访问方式。
对于数据库配置文件我们先提供一个类来表示其结构:
然后通过下面的类来访问,这里我们统统使用Xpath来搜索节点。
public
class
Sessions
![ExpandedBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
private static string _configPath;
private static XmlDocument dat;
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
static Sessions()
![ExpandedSubBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
_configPath = System.AppDomain.CurrentDomain.BaseDirectory + "xbase.xml";
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public SessionParameter GetSessionByName(string Name)
![ExpandedSubBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Resource res = new Resource(_configPath);
dat = new XmlDocument();
dat.LoadXml(res.Config[_configPath]);
string xp1 = "/config/session[@name=\""+Name+"\"]/connectionstring";
string xp2 = "/config/session[@name=\"" + Name + "\"]/assambly";
string xp3 = "/config/session[@name=\"" + Name + "\"]/provider";
string xp4 = "/config/session[@name=\"" + Name + "\"]/configbase";
SessionParameter sp = new SessionParameter();
sp.Connectionstring = dat.SelectSingleNode(xp1).InnerText;
sp.Assambly = dat.SelectSingleNode(xp2).InnerText.Trim();
sp.Provider = dat.SelectSingleNode(xp3).InnerText.Trim();
sp.Configbase = dat.SelectSingleNode(xp4).InnerText.Trim();
return sp;
}
}
这个样子就可以通过Session sec=Session.GetSessionByName(Name)来获取一个数据库配置文件了。
实现读取每个类的配置文件的方式相同,这里省略了,下来自己写
这里我们实现了包装读取配置的操作的类,接下来我们来看,如何实现插件的方式动态提供数据库操作组件
to be continue......
前一篇有人留言说为什么不写web.config?我个人非常反对庞大的web.config文件,可能其根源就在于互联星空系统的巨大的配置和它带来的混乱,自己实现一个小巧灵活的机制是我比较喜欢的,这样可以降低系统的侵入性,也可以方便我改成其他语言的版本。
这里我们来给刚才的Resource类加一个壳,因为我们毕竟不能用绝对的Path去访问,我们需要一个通过类名就可以访问得到配置的方式。
在加这个壳之前我们先规划一下配置文件,我们这里需要两种配置文件,一个是配置数据库连接的,一种是配置每个类的操作的,前边说过了,对输入和结果的映射在类的Attribute里完成,这样子配置每个类的配置文件就可以相当的简单了
数据库连接配置文件:
![None.gif](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![None.gif](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![None.gif](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![None.gif](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![None.gif](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![None.gif](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![None.gif](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![None.gif](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![None.gif](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
每个Session配置一个数据库连接,configbase是用来指定这个连接的配置文件所在的目录,以后获取每个类的配置文件就在这个配置项的值所在的目录里面。数据库配置文件在System.AppDomain.CurrentDomain.BaseDirectory里面搜索,不用配置
每个类的配置文件:
![None.gif](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![None.gif](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![None.gif](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![None.gif](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![None.gif](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Sql节配置SQL指令,参数用#开头,属性Cache指示这个查询是否被缓存
我们需要两个类来分别表示这两种配置文件来提供对其的访问方式。
对于数据库配置文件我们先提供一个类来表示其结构:
1
public
class
SessionParameter
2![ExpandedBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
3
private string connectionstring;
4![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
public string Connectionstring
6![ExpandedSubBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
7![ExpandedSubBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return connectionstring; }
8![ExpandedSubBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ connectionstring = value; }
9
}
10
private string assambly;
11![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
public string Assambly
13![ExpandedSubBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
14![ExpandedSubBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return assambly; }
15![ExpandedSubBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ assambly = value; }
16
}
17
private string provider;
18![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
19
public string Provider
20![ExpandedSubBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
21![ExpandedSubBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return provider; }
22![ExpandedSubBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ provider = value; }
23
}
24
private string configbase;
25![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
26
public string Configbase
27![ExpandedSubBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
28![ExpandedSubBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return configbase; }
29![ExpandedSubBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ configbase = value; }
30
}
31
}
32
}
![None.gif](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![ExpandedBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![dot.gif](http://www.cnblogs.com/Images/dot.gif)
3
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
4
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
![ExpandedSubBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](http://www.cnblogs.com/Images/dot.gif)
7
![ExpandedSubBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](http://www.cnblogs.com/Images/dot.gif)
8
![ExpandedSubBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](http://www.cnblogs.com/Images/dot.gif)
9
![ExpandedSubBlockEnd.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
10
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![ExpandedSubBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](http://www.cnblogs.com/Images/dot.gif)
14
![ExpandedSubBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](http://www.cnblogs.com/Images/dot.gif)
15
![ExpandedSubBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](http://www.cnblogs.com/Images/dot.gif)
16
![ExpandedSubBlockEnd.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
17
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
18
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
19
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
20
![ExpandedSubBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](http://www.cnblogs.com/Images/dot.gif)
21
![ExpandedSubBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](http://www.cnblogs.com/Images/dot.gif)
22
![ExpandedSubBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](http://www.cnblogs.com/Images/dot.gif)
23
![ExpandedSubBlockEnd.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
24
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
25
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
26
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
27
![ExpandedSubBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](http://www.cnblogs.com/Images/dot.gif)
28
![ExpandedSubBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](http://www.cnblogs.com/Images/dot.gif)
29
![ExpandedSubBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](http://www.cnblogs.com/Images/dot.gif)
30
![ExpandedSubBlockEnd.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
31
![ExpandedBlockEnd.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
32
![None.gif](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
然后通过下面的类来访问,这里我们统统使用Xpath来搜索节点。
![None.gif](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![ExpandedBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![dot.gif](http://www.cnblogs.com/Images/dot.gif)
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](http://www.cnblogs.com/Images/dot.gif)
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockEnd.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockStart.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](http://www.cnblogs.com/Images/dot.gif)
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockEnd.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![ExpandedBlockEnd.gif](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
这个样子就可以通过Session sec=Session.GetSessionByName(Name)来获取一个数据库配置文件了。
实现读取每个类的配置文件的方式相同,这里省略了,下来自己写
这里我们实现了包装读取配置的操作的类,接下来我们来看,如何实现插件的方式动态提供数据库操作组件
to be continue......