您现在的位置是:首页 > cms教程 > Discuz教程Discuz教程
Discuz!NT中的数据库链接类介绍
郭俊立2025-07-10Discuz教程已有人查阅
导读在7月份中我曾经写过一篇随笔叫,叫" .NET2.0 框架中的 AbstractFactory 模式 " 。里面主要说了在2.0框架下的数据库链接工厂中新增的几个类,而这几个类采用的就是抽象类工厂模式
在7月份中我曾经写过一篇随笔叫,叫" .NET2.0 框架中的 AbstractFactory 模式 " 。里面主要说了在2.0框架下的数据库链接工厂中新增的几个类,而这几个类采用的就是抽象类工厂模式(Abstract Factory)。因为在Discuz!NT 2。0中使用了这些新的类,所以导致我们的产品dbhelper.cs可以支持几种数据库(目前官方实现的有sqlserver ,access ,mysql)。但同时因为1.0框架下没有这些类,
所以我们采用自已简单实现其中主要的类代码来解决这个问题。这就有了今天文章的内容!
为了便于大家对照我将抽象类工厂模式结构图与项目中实现的结构图同时贴上:
首先请大家看一下AbstractFactory模式的结构图然后请大家看一下Discuz!NT项目中的数据链接结构图好,现在开始上路了。
这个架构中最主要的核心数据库链接所需要的(connection, Command,DataAdapter)对象就是围绕下面m_factory的使用和赋值展开的, 请看如下代码
那么目前我们假设使用的是SqlServer型的数据库,那么上面的"Discuz.Data.{0}Provider, Discuz.Data.{0}"
就会变成是"Discuz.Data.SqlServerProvider, Discuz.Data.SqlServer",我们不妨在这?乙幌翫iscuz.Data.SqlServer这个项目中,为方便,我这里直接将Discuz.Data.SqlServer这个类代码贴在这
同理大家可以找到另个两个项目DLL,Discuz.Data.Access中的AccessProvider.cs和Discuz.Data.MySql中的MySqlProvider.cs,大家会发现类似的代码实现。
现在大家应该清楚了这个数据库链接架构的核心了吧。
另外就是发表完这篇文章后,关于DISCUZ!NT系列的随笔会暂时先告一段落。主要是因为另外一系列的文章将要登场,这也是我最想写的文章,主要是关于ICONIX(UML)的。
所以我们采用自已简单实现其中主要的类代码来解决这个问题。这就有了今天文章的内容!
为了便于大家对照我将抽象类工厂模式结构图与项目中实现的结构图同时贴上:
首先请大家看一下AbstractFactory模式的结构图然后请大家看一下Discuz!NT项目中的数据链接结构图好,现在开始上路了。
这个架构中最主要的核心数据库链接所需要的(connection, Command,DataAdapter)对象就是围绕下面m_factory的使用和赋值展开的, 请看如下代码
1 /// <summary>
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 }
而其中的Provider.Instance();实现的代码如下
1 /// <summary>
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",我们不妨在这?乙幌翫iscuz.Data.SqlServer这个项目中,为方便,我这里直接将Discuz.Data.SqlServer这个类代码贴在这
1 public class SqlServerProvider : IDbProvider
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 }
其中SqlClientFactory是一个在.net2.0框架下才有的类,这里因为考虑产品架构在1。0和2。0下的对应关系,这里使用了相同的类名称。而这里类在抽象类工厂模式中的位置就是ConcreateFactory部分所需要实现的代码。同理大家可以找到另个两个项目DLL,Discuz.Data.Access中的AccessProvider.cs和Discuz.Data.MySql中的MySqlProvider.cs,大家会发现类似的代码实现。
现在大家应该清楚了这个数据库链接架构的核心了吧。
另外就是发表完这篇文章后,关于DISCUZ!NT系列的随笔会暂时先告一段落。主要是因为另外一系列的文章将要登场,这也是我最想写的文章,主要是关于ICONIX(UML)的。
本文标签:
很赞哦! ()
相关教程
图文教程
CentOs7搭建论坛Discuz_X3.2的步骤方法
由于公司项目需要一个互动平台,可以发起活动,发消息留言,讨论过后发现这竟然是一个论坛的功能。 于是就不打算耗费功夫开发相关功能,直接另外搭一套BBS算球。。。 一直觉得搭建B
discuz怎么去掉portal.php的方法
dz去掉portal.php的方法:首先在系统后台的导航设置中将默认的首页设置为“不可用”;然后在程序的根目录的“index.php”中修改内容为“$_E
discuz设置阅读权限的方法
discuz设置阅读权限:1、点击版块,进入版块管理界面;2、点击某个版块后面的“编辑”按钮;3、在打开的界面中,点击“权限相关”,勾选“浏览版块”列和“用户组”行交叉的复选框;4、点击提交即可完成阅读权限的设置。
Discuz!NT中远程附件功能实现方法,FTP协议
大约在去年的12月份,我们开始着手设计和开发这项功能,而该项功能主要是解决类似于一些帖子附件(图片或文件)访问比较频繁,同时附件的体积又比较大
相关源码
-
帝国CMS7.5手游资讯下载综合门户免费网站模板本模板基于帝国CMS7.5内核开发,为手游打造的综合门户网站解决方案。模板设计充分考虑了手业的特性,包含游戏资讯发布、手游下载、礼包发放、开测信息等核心功能模块,满足手游门户网站的各项业务需求。查看源码 -
pbootcms(自适应)SEO优化排名服务公司网站模板核心定位为SEO排名服务商打造的营销型网站框架,集成PbootCMS开源系统的高效管理能力与SEO最佳实践方案,助力企业快速建立专业的技术服务形象。查看源码 -
(自适应响应式)HTML5磁电机械设备蓝色营销型网站pbootcms模板本模板为磁电设备行业设计,采用蓝色营销风格,突出工业设备的专业性和技术感。模板结构清晰,能够有效展示磁电设备的技术参数、应用场景和企业实力,帮助客户快速了解产品特点和公司服务。查看源码 -
(PC+WAP)中英双语户外用品帐篷装备pbootcms网站模板下载这款基于PbootCMS开发的中英文双语模板专为户外装备行业设计,适配PC和移动设备。模板采用现代化设计风格,突出户外产品的功能性和实用性,帮助企业建立专业的国际化展示平台。查看源码 -
(自适应响应式)门窗定制门业带视频功能pbootcms模板下载本模板采用PbootCMS内核开发,为门窗制造、定制安装企业打造,通过可视化后台管理系统快速构建品牌官网。自适应设计确保在手机、平板、电脑等设备上均能获得优质浏览体验查看源码 -
(自适应响应式)蓝色勘察设计院机构单位商会协会pbootcms模板下载本模板基于PbootCMS系统开发,为勘察设计院所、工程咨询单位设计,特别适合展示设计成果、技术服务和项目案例。采用响应式技术,确保设计图纸和方案以及文案在不同设备上都能清晰展示。查看源码
| 分享笔记 (共有 篇笔记) |
