您现在的位置是:首页 > 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的使用和赋值展开的, 请看如下代码
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)的。

本文标签:

很赞哦! ()

相关源码

  • (PC+WAP)智能机器人人工智能物联网自动化设备源码下载本模板基于PbootCMS内核开发,为智能机器人及传感器科技企业精心设计。采用现代化设计风格,突出科技感与专业性,多方位展示企业技术实力与产品优势。查看源码
  • (自适应)帝国cms7.5模板新闻资讯门户带会员中心基于帝国CMS7.5内核开发的HTML5响应式模板,为新闻机构、媒体门户及资讯聚合平台设计。通过模块化布局实现图文混排查看源码
  • (自适应)绿色农业机械设备农场网站源码下载为现代农业机械领域打造的响应式网站模板,采用PbootCMS内核开发,数据实时同步后台管理。通过简洁大气的视觉设计,有效展示农机产品技术参数与应用场景,帮助客户快速建立专业数字化形象。查看源码
  • (自适应响应式)AI智能电子科技产品pbootcms网站模板下载基于PbootCMS内核的响应式模板,为AI智能硬件、电子产品等科技企业打造,通过技术创新实现品牌数字化升级。查看源码
  • 帝国CMS7.5二次元COS漫展网站模板源码免费下载本模板基于帝国CMS 7.5版本深度开发,为二次元文化分享领域设计。采用UTF-8编码,支持中文内容展示,特别适用于COSPLAY作品展示、漫展信息发布等二次元相关内容的网站建设。模板结构清晰,布局合理,充分考虑了二次元用户群体的浏览习惯和审美需求。查看源码
  • PbootCMS(自适应手机端)智能电话AI机器人网站模板产品概述基于PbootCMS内核开发的智能电话AI机器人网站模板,为语音交互服务场景设计,采用HTML5+CSS3响应式布局技术,实现PC端与移动端数据实时同步展示。模板适用于智能电话查看源码
分享笔记 (共有 篇笔记)
验证码:

本栏推荐