设计模式之抽象工厂模式(二)

 七、.NET 2.0中的抽象工厂模式

  .NET 2.0相比.NET 1.1有很大的改进,就在ADO.NET上来说吧,提供了一套新的操作接口。下面我就简单的介绍下这套接口的设计,在System.Date下提供了 IDbConnection 、IDbCommand、IDbDataAdapter以及IDbTransaction这样一系列接口,通过ProviderFactory来完成具体 实现对象的创建,这里就是抽象工厂模式的一个应用。示意性代码:

1public IDbConnection CreateConnection()
2{
3  IDbConnection conn = null;
4  try
5  {
6    conn = (IDbConnection)Activator.CreateInstance(_connectionTypes[(int)_provider]);
7  }
8  catch(TargetInvocationException e)
9  {
10    throw new Exception(e.Message);
11  }
12  return conn;
13}
14
15public IDbConnection CreateConnection(string connectionString)
16{
17  IDbConnection conn = null;
18  object[] param ={ connectionString };
19  try
20  {
21    conn = (IDbConnection)Activator.CreateInstance(_connectionTypes[(int)_provider], param);
22  }
23  catch (TargetInvocationException e)
24  {
25    throw new Exception(e.Message);
26  }
27  return conn;
28}

  在_connectionTypes数组里存放的是IDbConnection接口的具体实现类型,如下:

  private static Type[] _connectionTypes = new Type[] { typeof(OleDbConnection), typeof(SqlConnection) };

  由于Command,DataAdapter等对象的代码都和上面很相似,这里就不作过多解释,我把代码贴到下面,有兴趣的看看:

ProviderFactory

 1using System;
 2using System.Data;
 3using System.Configuration;
 4using System.Web;
 5using System.Web.Security;
 6using System.Web.UI;
 7using System.Web.UI.WebControls;
 8using System.Web.UI.WebControls.WebParts;
 9using System.Web.UI.HtmlControls;
10using System.Reflection;
11using System.Data.OleDb;
12using System.Data.SqlClient;
13
14/** <summary>
15/// ProviderFactory 的摘要说明
16/// </summary>
17public class ProviderFactory
18{
19  /** <summary>
20  /// 私有构造器,伪单例。
21  /// 一个具体的工厂通常是一个单件(Singleton)。
22  /// </summary>
23  private ProviderFactory()
24  {
25
26  }
27
28  public ProviderFactory(ProviderType provider)
29  {
30    _provider = provider;
31  }
32
33  private static Type[] _connectionTypes = new Type[] { typeof(OleDbConnection), typeof(SqlConnection) };
34  private static Type[] _commandTypes = new Type[] { typeof(OleDbCommand), typeof(SqlCommand) };
35  private static Type[] _dataAdapterTypes = new Type[] { typeof(OleDbDataAdapter), typeof(SqlDataAdapter) };
36  private static Type[] _dataParameterTypes = new Type[] { typeof(OleDbParameter), typeof(SqlParameter) };
37  
38  private ProviderType _provider;
39  public ProviderType Provider
40  {
41    get { return _provider; }
42    set { _provider = value; }
43  }
44
45  public IDbConnection CreateConnection()
46  {
47    IDbConnection conn = null;
48    try
49    {
50      conn = (IDbConnection)Activator.CreateInstance(_connectionTypes[(int)_provider]);
51    }
52    catch(TargetInvocationException e)
53    {
54      throw new Exception(e.Message);
55    }
56    return conn;
57  }
58
59  public IDbConnection CreateConnection(string connectionString)
60  {
61    IDbConnection conn = null;
62    object[] param ={ connectionString };
63    try
64    {
65      conn = (IDbConnection)Activator.CreateInstance(_connectionTypes[(int)_provider], param);
66    }
67    catch (TargetInvocationException e)
68    {
69      throw new Exception(e.Message);
70    }
71    return conn;
72  }
73
74  public IDbCommand CreateCommand()
75  {
76    IDbCommand cmd = null;
77    try
78    {
79      cmd = (IDbCommand)Activator.CreateInstance(_commandTypes[(int)_provider]);
80    }
81    catch (TargetInvocationException e)
82    {
83      throw new Exception(e.Message);
84    }
85    return cmd;
86  }
87
88  public IDbCommand CreateCommand(string cmdText)
89  {
90    IDbCommand cmd = null;
91    object[] args = { cmdText };
92    try
93    {
94      cmd = (IDbCommand)Activator.CreateInstance(_commandTypes[(int)_provider], args);
95    }
96    catch (TargetInvocationException e)
97    {
98      throw new Exception(e.Message);
99    }
100    return cmd;
101  }
102
103  public IDbCommand CreateCommand(string cmdText, IDbConnection connection)
104  {
105    IDbCommand cmd = null;
106    object[] args = { cmdText, connection };
107    try
108    {
109      cmd = (IDbCommand)Activator.CreateInstance(_commandTypes[(int)_provider], args);
110    }
111    catch (TargetInvocationException e)
112    {
113      throw new Exception(e.Message);
114    }
115    return cmd;
116  }
117
118  public IDbCommand CreateCommand(string cmdText, IDbConnection connection, IDbTransaction transaction)
119  {
120    IDbCommand cmd = null;
121    object[] args = { cmdText, connection, transaction };
122    try
123    {
124      cmd = (IDbCommand)Activator.CreateInstance(_commandTypes[(int)_provider], args);
125    }
126    catch (TargetInvocationException e)
127    {
128      throw new Exception(e.Message);
129    }
130    return cmd;
131  }
132
133  public IDbDataAdapter CreateDataAdapter()
134  {
135    IDbDataAdapter da = null;
136    try
137    {
138      da = (IDbDataAdapter)Activator.CreateInstance(_dataAdapterTypes[(int)_provider]);
139    }
140    catch (TargetInvocationException e)
141    {
142      throw new SystemException(e.InnerException.Message, e.InnerException);
143    }
144    return da;
145  }
146
147  public IDbDataAdapter CreateDataAdapter(IDbCommand selectCommand)
148  {
149    IDbDataAdapter da = null;
150    object[] args = { selectCommand };
151    try
152    {
153      da = (IDbDataAdapter)Activator.CreateInstance(_dataAdapterTypes[(int)_provider], args);
154    }
155    catch (TargetInvocationException e)
156    {
157      throw new SystemException(e.InnerException.Message, e.InnerException);
158    }
159    return da;
160  }
161
162  public IDbDataAdapter CreateDataAdapter(string selectCommandText, IDbConnection selectConnection)
163  {
164    IDbDataAdapter da = null;
165    object[] args = { selectCommandText, selectConnection };
166    try
167    {
168      da = (IDbDataAdapter)Activator.CreateInstance(_dataAdapterTypes[(int)_provider], args);
169    }
170    catch (TargetInvocationException e)
171    {
172      throw new SystemException(e.InnerException.Message, e.InnerException);
173    }
174    return da;
175  }
176
177  public IDbDataAdapter CreateDataAdapter(string selectCommandText, string selectConnectionString)
178  {
179    IDbDataAdapter da = null;
180    object[] args = { selectCommandText, selectConnectionString };
181    try
182    {
183      da = (IDbDataAdapter)Activator.CreateInstance(_dataAdapterTypes[(int)_provider], args);
184    }
185    catch (TargetInvocationException e)
186    {
187      throw new SystemException(e.InnerException.Message, e.InnerException);
188    }
189    return da;
190  }
191
192  public IDbDataParameter CreateDataParameter()
193  {
194    IDbDataParameter param = null;
195    try
196    {
197      param = (IDbDataParameter)Activator.CreateInstance(_dataParameterTypes[(int)_provider]);
198    }
199    catch (TargetInvocationException e)
200    {
201      throw new SystemException(e.InnerException.Message, e.InnerException);
202    }
203    return param;
204  }
205
206  public IDbDataParameter CreateDataParameter(string parameterName, object value)
207  {
208    IDbDataParameter param = null;
209    object[] args = { parameterName, value };
210    try
211    {
212      param = (IDbDataParameter)Activator.CreateInstance(_dataParameterTypes[(int)_provider], args);
213    }
214    catch (TargetInvocationException e)
215    {
216      throw new SystemException(e.InnerException.Message, e.InnerException);
217    }
218    return param;
219  }
220
221  public IDbDataParameter CreateDataParameter(string parameterName, DbType dataType)
222  {
223    IDbDataParameter param = CreateDataParameter();
224    if (param != null)
225    {
226      param.ParameterName = parameterName;
227      param.DbType = dataType;
228    }
229    return param;
230  }
231
232  public IDbDataParameter CreateDataParameter(string parameterName, DbType dataType, int size)
233  {
234    IDbDataParameter param = CreateDataParameter();
235    if (param != null)
236    {
237      param.ParameterName = parameterName;
238      param.DbType = dataType;
239      param.Size = size;
240    }
241    return param;
242  }
243
244  public IDbDataParameter CreateDataParameter(string parameterName, DbType dataType, int size, string sourceColumn)
245  {
246    IDbDataParameter param = CreateDataParameter();
247    if (param != null)
248    {
249      param.ParameterName = parameterName;
250      param.DbType = dataType;
251      param.Size = size;
252      param.SourceColumn = sourceColumn;
253    }
254    return param;
255  }
256}

关于.NET 2.0的这一知识点不了解的朋友可以下载Web Cast课程进行学习。本文就简单的介绍这些。

  七、.NET 2.0中的新ADO.NET操作接口应用示例

 建立一ASP.NET网站项目,在默认的Default.aspx里放置一个GridView控件便OK。这里以MSSQL 2000里的Northwind数据库作为示例数据库,查询出订单表的数据呈现在aspx页面上,进入后台代码文件(.cs文件):

1public partial class _Default : System.Web.UI.Page
2{
3  protected void Page_Load(object sender, EventArgs e)
4  {
5    string connectionString="Data Source=.;Initial Catalog=Northwind;user id=sa;password=;";
6    string cmdText = "select * from orders";
7
8    ProviderFactory factory = new ProviderFactory(ProviderType.SqlClient);
9    IDbConnection conn = factory.CreateConnection(connectionString);
10    IDbDataAdapter sda = factory.CreateDataAdapter(cmdText, conn);
11    DataSet ds = new DataSet();
12    sda.Fill(ds);
13    this.GridView1.DataSource = ds.Tables[0];
14    this.GridView1.DataBind();
15  }
16}

   ProviderFactory担任着工厂的角色,负责创建如IDbConnection、IDbCommand等一系列的产品。如上,我们拿到了工厂 角色,通过工厂角色的CreateConnection就创建到了一个基于抽象产品角色IDbConnection接口的实现对象(具体是什么实现对象我 们暂不管)。

  .NET 2.0提供了这一套操作接口,对于程序实现上就更加灵活了,更是强调了使用“依赖接口/抽象编程”的思想。

  注:转载请注明出处:http://beniao.cnblogs.com/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值