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,大家會發現類似的代碼實現。
??? ??
??? 現在大家應該清楚了這個數據庫鏈接架構的核心了吧。
這也是我最想寫的文章,主要是關于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 中的数据库链接类(重构到抽象类工厂模式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 社保,交得越多亏得越多(转)
- 下一篇: 宾浪超.何飞玲.相爱(帮别人名字隔字作诗