Discuz!NT 中的数据库链接类(重构到抽象类工厂模式)
里面主要说了在2.0框架下的数据库链接工厂中新增的几个类,而这几个类采用的就是 抽象类工厂模式
(Abstract Factory)。因为在Discuz!NT 2。0中使用了这些新的类,所以导致我们的产品dbhelper.cs
可以支持几种数据库(目前官方实现的有sqlserver ,access ,mysql)。但同时因为1.0框架下没有这些类,
所以我们采用自已简单实现其中主要的类代码来解决这个问题。这就有了今天文章的内容!
为了便于大家对照我将抽象类工厂模式结构图与项目中实现的结构图同时贴上:
首先请大家看一下AbstractFactory模式的结构图
然后请大家看一下Discuz!NT项目中的数据链接结构图
好,现在开始上路了。
这个架构中最主要的核心数据库链接所需要的(connection, Command,DataAdapter)对象就是围绕下面
m_factory的使用和赋值展开的, 请看如下代码
2 /// DbProviderFactory实例
3 /// </summary>
4 private static IDbProviderFactory m_factory = null;
5
6 /// <summary>
7 /// DbFactory实例
8 /// </summary>
9 public static IDbProviderFactory Factory
10 {
11 get
12 {
13 if (m_factory == null)
14 {
15 m_factory = Provider.Instance();
16 }
17 return m_factory;
18 }
19 }
20
而其中的Provider.Instance();实现的代码如下
2 /// Discuz!NT数据接口
3 /// </summary>
4 private static IDbProvider m_provider = null;
5
6 /// <summary>
7 /// IDbProvider接口
8 /// </summary>
9 public static IDbProvider Provider
10 {
11 get
12 {
13 if (m_provider == null)
14 {
15 lock(lockHelper)
16 {
17 if (m_provider == null)
18 {
19 try
20 {
21 m_provider = (IDbProvider)Activator.CreateInstance(Type.GetType(string.Format("Discuz.Data.{0}Provider, Discuz.Data.{0}", BaseConfigs.GetDbType)));
22 }
23 catch
24 {
25 throw new Exception("请检查DNT.config中Dbtype节点数据库类型是否正确,例如:SqlServer、Access、MySql,注意大小写。");
26 }
27
28 }
29 }
30
31 //m_provider = new DbProviderFinder().GetDbProvider("accesss");
32
33
34 }
35 return m_provider;
36 }
37 }
38
大家看到这里使用了反射,而BaseConfigs.GetDbType这个属性的调用在一个叫做Dnt.config的文件
中有相应设置,它标识了当前数据库是Sqlserver,Access还是MySql。
那么目前我们假设使用的是SqlServer型的数据库,那么上面的"Discuz.Data.{0}Provider, Discuz.Data.{0}"
就会变成是"Discuz.Data.SqlServerProvider, Discuz.Data.SqlServer",我们不妨在这里找一下Discuz.Data.SqlServer
这个项目中,为方便,我这里直接将Discuz.Data.SqlServer这个类代码贴在这
2 {
3 public IDbProviderFactory Instance()
4 {
5 return SqlClientFactory.Instance;
6 }
7
8 public void DeriveParameters(IDbCommand cmd)
9 {
10 if ((cmd as SqlCommand) != null)
11 {
12 SqlCommandBuilder.DeriveParameters(cmd as SqlCommand);
13 }
14 }
15
16 public IDataParameter MakeParam(string ParamName, DbType DbType, Int32 Size)
17 {
18 SqlParameter param;
19
20 if (Size > 0)
21 param = new SqlParameter(ParamName, (SqlDbType)DbType, Size);
22 else
23 param = new SqlParameter(ParamName, (SqlDbType)DbType);
24
25 return param;
26 }
27
28
29
30 }
31
32 //SqlClientFactory工厂类,提供对SqlServerProvider中的Instance返回实例的支持
33 public class SqlClientFactory : IDbProviderFactory
34 {
35 public static readonly SqlClientFactory Instance;
36
37 static SqlClientFactory()
38 {
39 Instance = new SqlClientFactory();
40 }
41
42 private SqlClientFactory()
43 {
44 }
45
46
47 public IDbConnection CreateConnection()
48 {
49 return new SqlConnection();
50 }
51
52
53 public IDbCommand CreateCommand()
54 {
55 return new SqlCommand();
56 }
57
58 public IDbDataAdapter CreateDataAdapter()
59 {
60 return new SqlDataAdapter();
61 }
62
63 }
64
65
其中SqlClientFactory是一个在.net2.0框架下才有的类,这里因为考虑产品架构在1。0和2。0下的对应关系,这里
使用了相同的类名称。而这里类在抽象类工厂模式中的位置就是ConcreateFactory部分所需要实现的代码。
同理大家可以找到另个两个项目DLL,Discuz.Data.Access中的AccessProvider.cs和Discuz.Data.MySql中的
MySqlProvider.cs,大家会发现类似的代码实现。
现在大家应该清楚了这个数据库链接架构的核心了吧。
另外就是发表完这篇文章后,关于DISCUZ!NT系列的随笔会暂时先告一段落。主要是因为另外一系列的文章将要登场,
这也是我最想写的文章,主要是关于ICONIX(UML)的。
最后再把这个系列中的随笔进行一下分类归纳如下:
控件类:
Discuz!NT控件剖析 之 Button [原创: 附源码]
Discuz!NT控件剖析 之 TextBox [原创: 附源码]
Discuz!NT控件剖析 之 ColorPicker(颜色拾取) 和Calendar(日历) [原创: 附源码]
Discuz!NT控件剖析 之 Tab 属性页 [原创: 附源码]
架构类:
Discuz!NT 缓存设计简析 [原创]
Discuz!NT 聚合功能页面程序架构(重构到Facade与Observer模式)
Discuz!NT 中的数据库链接类(抽象类工厂模式)
插件类:
Discuz!NT 邮件插件机制分析
Discuz!NT 中的数据库链接类(重构到抽象类工厂模式)相关推荐
- 动软多数据库链接类实例
最近做一个项目是用动软生成的框架搭建的,但是我想大家也都清楚,动软生成的都是比较简单的表类而已,而且默认是只有一个数据库链接,通过DbHelperSQL.cs来操作链接的,但是如果涉及两个数据库交互的 ...
- php定义数据表类,phpwind中的数据库操作类
phpwind中的数据库操作类 2021-01-22 20:12:15141 /*来源:phpwind.net*/ ClassDB{ var$query_num=0; functionDB($dbho ...
- phpwind database.php,phpwind中的数据库操作类
phpwind中的数据库操作类 更新时间:2007年01月02日 00:00:00 作者: /*来源:phpwind.net*/ Class DB { var $query_num = 0; fu ...
- wp-db.php,WordPress中的数据库操作类wp-db.php
版权:转载 来源:互联网 WordPress中的数据库操作类wp-db.php的原型是ezSQL.官方网站: http://php.justinvincent.com ezSQL支持对如下数据库的操作 ...
- PHP数据库链接类(PDO+Access)
PHP PDO Access链接 class DbHelpClass{private $conn;private $qxId;private $ret;function __construct(){$ ...
- c++几何类和几何简单工厂模式
直接上报告了,不想再修改了 里面有很多算法都是学习其他朋友的,希望体谅 代码都是自己一句一句写的,不容易,有问题可以评论区见 一.实习题目 1.实现一个集合类 CSet(完成代码并测试运行),能够存储 ...
- Discuz!NT高并发解决方案整理
最近几天一直在读代震军的博客,他是Discuz!NT的设计者,读了他的一系列关于Discuz!NT的架构设计文章,大呼过瘾,特别是Discuz!NT在解决高访问高并发时所设计的一系列方案,本人尤其感兴 ...
- PHP中封装mysql数据库链接(简单版)
为什么80%的码农都做不了架构师?>>> 1,封装mysql数据链接需要哪些属性 主机地址,数据库名,数据库密码,数据库名,字符集 2,利用构造方法在实例化类时,php底层会自 ...
- Discuz!NT负载均衡方案
在前面的几篇文章中,主要谈到了在Discuz!NT中的跨站缓存数据,数据库负载均衡.但如果要实现将产品分布式布置到若干机器,组成集群来共同支撑起整个业务的话,还是有一定问题的(后面会有所介绍).下面先 ...
最新文章
- 精确微妙计时minicom 源码节选
- BUUCTF(PWN)suctf_2018_stack
- 使用 vim 开发-编译-查错-运行/测试-调试最佳实践流程
- 软件工程讲义 0 微博上的软件工程
- python字典popitem_Python 字典(Dictionary) | 菜鸟教程
- Spring MVC起步(一)
- mysqldump: Got errno 28 on write
- 二叉树层级遍历_二叉树中的层级顺序遍历
- 学习廖雪峰的Python教程之Python基础
- winpcap的使用
- 5.7 C和C++的关系
- matlab3维b样条曲线_MATLAB-3次B样条
- 《数值分析》-- 数值计算中的误差与有效数字
- linux锐捷认证成功无法上网,主编传授win10系统锐捷认证成功但是却无法上网的方法...
- 【程序员面试金典】有一个XxY的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。请设计一个算法,计算机器人有多少种走法。注意这次的网格中有些障碍点是不能走的。
- leetcode回溯算法
- SYS Informer 完整显示系统、电脑软硬件详细信息
- PTA 7-274 魔镜
- Java面试题十篇基本问题,学完这些我就不信拿不到offer
- ACM训练方法_该我自己检讨了_By LCY
热门文章
- 全球最大sap hana系统建立在以下哪个厂商的服务器产品上,全球最大sap hana系统建立在以下哪个厂商的服务器产品上...
- python的目的及应用_python Django中的apps.py的目的是什么_python_脚本之家
- 永磁同步电机试验系统的设计
- python3网上学习资源汇总
- mybatis学习3之分页的实现
- python几岁开始学_python编程少儿几岁可以学?有哪些优势?
- Java虚拟机学习(8):查看JVM参数及值的命令行工具
- Java反射在JVM的实现
- 分类器评价与在R中的实现:混淆矩阵
- 您能看出这个生成缩略图的方法有什么问题吗?