来到这里已经半个月了,感谢MSTC不惜重金聘请MVP来教我们这48个菜鸟(整体素质之低有时候自己都觉得丢人),两本基础书籍的学习完成后,作为练笔,写了一个分布式的图书管理系统,规定时间10天,我用4天就搞定了,如果不是练玩带写的话,估计会更快。
这里第一次用到了自己的抽象工厂模式(Abstract Factory Pattern),但实际上却很失败——系统所有的数据访问基本上都要求用SP来做,这使得我的工厂形同虚设
但无论如何,还是写一下这个工厂吧:
首先是抽象工厂类(AbstractDbFactory.cs)
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.Data;
5
6namespace DAL
7{
8 /**//// <summary>
9 /// 数据库抽象工厂接口
10 /// </summary>
11 public interface AbstractDbFactory
12 {
13 /**//// <summary>
14 /// 建立默认连接
15 /// </summary>
16 /// <returns>数据库连接</returns>
17 IDbConnection CreateConnection();
18
19 /**//// <summary>
20 /// 根据连接字符串建立Connection对象
21 /// </summary>
22 /// <param name="strConn">连接字符串</param>
23 /// <returns>Connection对象</returns>
24 IDbConnection CreateConnection(string strConn);
25
26 /**//// <summary>
27 /// 建立Command对象
28 /// </summary>
29 /// <returns>Command对象</returns>
30 IDbCommand CreateCommand();
31
32 /**//// <summary>
33 /// 建立DataAdapter对象
34 /// </summary>
35 /// <returns>DataAdapter对象</returns>
36 IDbDataAdapter CreateDataAdapter();
37
38 /**//// <summary>
39 /// 根据Connection建立Transaction
40 /// </summary>
41 /// <param name="myDbConnection">Connection对象</param>
42 /// <returns>Transaction对象</returns>
43 IDbTransaction CreateTransaction(IDbConnection myDbConnection);
44
45 /**//// <summary>
46 /// 根据Command建立DataReader
47 /// </summary>
48 /// <param name="myDbCommand">Command对象</param>
49 /// <returns>DataReader对象</returns>
50 IDataReader CreateDataReader(IDbCommand myDbCommand);
51
52 /**//// <summary>
53 /// 根据参数名和参数值建立DataParamter
54 /// </summary>
55 /// <param name="strProcName">参数名称</param>
56 /// <param name="value">参数值</param>
57 /// <returns>DataParamter对象</returns>
58 IDataParameter CreateDataParamter(string strParaName,object value);
59
60 /**//// <summary>
61 /// 获得连接字符串
62 /// </summary>
63 /// <returns>连接字符串</returns>
64 string GetConnectionString();
65 }
66}
2using System.Collections.Generic;
3using System.Text;
4using System.Data;
5
6namespace DAL
7{
8 /**//// <summary>
9 /// 数据库抽象工厂接口
10 /// </summary>
11 public interface AbstractDbFactory
12 {
13 /**//// <summary>
14 /// 建立默认连接
15 /// </summary>
16 /// <returns>数据库连接</returns>
17 IDbConnection CreateConnection();
18
19 /**//// <summary>
20 /// 根据连接字符串建立Connection对象
21 /// </summary>
22 /// <param name="strConn">连接字符串</param>
23 /// <returns>Connection对象</returns>
24 IDbConnection CreateConnection(string strConn);
25
26 /**//// <summary>
27 /// 建立Command对象
28 /// </summary>
29 /// <returns>Command对象</returns>
30 IDbCommand CreateCommand();
31
32 /**//// <summary>
33 /// 建立DataAdapter对象
34 /// </summary>
35 /// <returns>DataAdapter对象</returns>
36 IDbDataAdapter CreateDataAdapter();
37
38 /**//// <summary>
39 /// 根据Connection建立Transaction
40 /// </summary>
41 /// <param name="myDbConnection">Connection对象</param>
42 /// <returns>Transaction对象</returns>
43 IDbTransaction CreateTransaction(IDbConnection myDbConnection);
44
45 /**//// <summary>
46 /// 根据Command建立DataReader
47 /// </summary>
48 /// <param name="myDbCommand">Command对象</param>
49 /// <returns>DataReader对象</returns>
50 IDataReader CreateDataReader(IDbCommand myDbCommand);
51
52 /**//// <summary>
53 /// 根据参数名和参数值建立DataParamter
54 /// </summary>
55 /// <param name="strProcName">参数名称</param>
56 /// <param name="value">参数值</param>
57 /// <returns>DataParamter对象</returns>
58 IDataParameter CreateDataParamter(string strParaName,object value);
59
60 /**//// <summary>
61 /// 获得连接字符串
62 /// </summary>
63 /// <returns>连接字符串</returns>
64 string GetConnectionString();
65 }
66}
然后是通用工厂接口(Factory.cs)
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.Configuration;
5using System.Xml;
6
7namespace DAL
8{
9 /**//// <summary>
10 /// Factory类
11 /// </summary>
12 public sealed class Factory
13 {
14 private static volatile Factory singleFactory = null;
15 private static object syncObj = new object();
16 /**//// <summary>
17 /// Factory类构造函数
18 /// </summary>
19 private Factory()
20 {
21 }
22
23 /**//// <summary>
24 /// 获得Factory类的实例
25 /// </summary>
26 /// <returns>Factory类实例</returns>
27 public static Factory GetInstance()
28 {
29 if (singleFactory == null)
30 {
31 lock (syncObj)
32 {
33 if (singleFactory == null)
34 {
35 singleFactory = new Factory();
36 }
37 }
38 }
39 return singleFactory;
40 }
41
42 /**////// <summary>
43 ///// Read confing
44 ///// </summary>
45 ///// <param name="appKey">参数</param>
46 ///// <returns></returns>
47 //public string GetConfigValue(string appKey)
48 //{
49 // XmlDocument xDoc = new XmlDocument();
50 // try
51 // {
52 // xDoc.Load(".//DAL.dll.config");
53 // //xDoc.Load(System.Windows.Forms.Application.ExecutablePath+".config");
54 // XmlNode xNode;
55 // XmlElement xElem;
56 // xNode = xDoc.SelectSingleNode("//appSettings");
57 // xElem = (XmlElement)xNode.SelectSingleNode("//add[@key='" + appKey + "']");
58 // if (xElem != null)
59 // return xElem.GetAttribute("value");
60 // else
61 // return "";
62 // }
63 // catch (Exception)
64 // {
65 // return "";
66 // }
67 //}
68
69 /**//// <summary>
70 /// 建立Factory类实例
71 /// </summary>
72 /// <returns>Factory类实例</returns>
73 public AbstractDbFactory CreateInstance()
74 {
75 AbstractDbFactory abstractDbFactory = null;
76 switch (ConfigurationSettings.AppSettings["DatabaseType"].ToLower())
77 {
78 case "sqlserver":
79 {
80 abstractDbFactory = new SqlFactory();
81 break;
82 }
83 case "oledb":
84 {
85 abstractDbFactory = new OleDbFactory();
86 break;
87 }
88
2using System.Collections.Generic;
3using System.Text;
4using System.Configuration;
5using System.Xml;
6
7namespace DAL
8{
9 /**//// <summary>
10 /// Factory类
11 /// </summary>
12 public sealed class Factory
13 {
14 private static volatile Factory singleFactory = null;
15 private static object syncObj = new object();
16 /**//// <summary>
17 /// Factory类构造函数
18 /// </summary>
19 private Factory()
20 {
21 }
22
23 /**//// <summary>
24 /// 获得Factory类的实例
25 /// </summary>
26 /// <returns>Factory类实例</returns>
27 public static Factory GetInstance()
28 {
29 if (singleFactory == null)
30 {
31 lock (syncObj)
32 {
33 if (singleFactory == null)
34 {
35 singleFactory = new Factory();
36 }
37 }
38 }
39 return singleFactory;
40 }
41
42 /**////// <summary>
43 ///// Read confing
44 ///// </summary>
45 ///// <param name="appKey">参数</param>
46 ///// <returns></returns>
47 //public string GetConfigValue(string appKey)
48 //{
49 // XmlDocument xDoc = new XmlDocument();
50 // try
51 // {
52 // xDoc.Load(".//DAL.dll.config");
53 // //xDoc.Load(System.Windows.Forms.Application.ExecutablePath+".config");
54 // XmlNode xNode;
55 // XmlElement xElem;
56 // xNode = xDoc.SelectSingleNode("//appSettings");
57 // xElem = (XmlElement)xNode.SelectSingleNode("//add[@key='" + appKey + "']");
58 // if (xElem != null)
59 // return xElem.GetAttribute("value");
60 // else
61 // return "";
62 // }
63 // catch (Exception)
64 // {
65 // return "";
66 // }
67 //}
68
69 /**//// <summary>
70 /// 建立Factory类实例
71 /// </summary>
72 /// <returns>Factory类实例</returns>
73 public AbstractDbFactory CreateInstance()
74 {
75 AbstractDbFactory abstractDbFactory = null;
76 switch (ConfigurationSettings.AppSettings["DatabaseType"].ToLower())
77 {
78 case "sqlserver":
79 {
80 abstractDbFactory = new SqlFactory();
81 break;
82 }
83 case "oledb":
84 {
85 abstractDbFactory = new OleDbFactory();
86 break;
87 }
88