大家看到这里使用了反射,而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这个类代码贴在这
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 }
64
65
其中SqlClientFactory是一个在.net2.0框架下才有的类,这里因为考虑产品架构在1。0和2。0下的对应关系,这里
使用了相同的类名称。而这里类在抽象类工厂模式中的位置就是ConcreateFactory部分所需要实现的代码。
同理大家可以找到另个两个项目DLL,Discuz.Data.Access中的AccessProvider.cs和Discuz.Data.MySql中的
MySqlProvider.cs,大家会发现类似的代码实现。
|