手把手教你写ORM(四)
现在中午不睡一会儿就头晕。
前一篇有人留言说为什么不写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
{
private static string _configPath;
private static XmlDocument dat;

static Sessions()
{
_configPath = System.AppDomain.CurrentDomain.BaseDirectory + "xbase.xml";

}

public SessionParameter GetSessionByName(string Name)
{
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里完成,这样子配置每个类的配置文件就可以相当的简单了
数据库连接配置文件:









每个Session配置一个数据库连接,configbase是用来指定这个连接的配置文件所在的目录,以后获取每个类的配置文件就在这个配置项的值所在的目录里面。数据库配置文件在System.AppDomain.CurrentDomain.BaseDirectory里面搜索,不用配置
每个类的配置文件:





Sql节配置SQL指令,参数用#开头,属性Cache指示这个查询是否被缓存
我们需要两个类来分别表示这两种配置文件来提供对其的访问方式。
对于数据库配置文件我们先提供一个类来表示其结构:
1
public class SessionParameter
2
{
3
private string connectionstring;
4
5
public string Connectionstring
6
{
7
get { return connectionstring; }
8
set { connectionstring = value; }
9
}
10
private string assambly;
11
12
public string Assambly
13
{
14
get { return assambly; }
15
set { assambly = value; }
16
}
17
private string provider;
18
19
public string Provider
20
{
21
get { return provider; }
22
set { provider = value; }
23
}
24
private string configbase;
25
26
public string Configbase
27
{
28
get { return configbase; }
29
set { configbase = value; }
30
}
31
}
32
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

然后通过下面的类来访问,这里我们统统使用Xpath来搜索节点。




























这个样子就可以通过Session sec=Session.GetSessionByName(Name)来获取一个数据库配置文件了。
实现读取每个类的配置文件的方式相同,这里省略了,下来自己写
这里我们实现了包装读取配置的操作的类,接下来我们来看,如何实现插件的方式动态提供数据库操作组件
to be continue......
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述