接上一篇文章《设计模式学习之抽象工厂模式(实现数据访问层)》继续学习,抽象工厂模式,本文在上一篇文章(对应程序为1.0,本文对应的程序为2.0版本)的基础之上上进行了改进。当然程序也升级为2.0版本啦。废话不多说,学习。
在1.0版本的程序中,大家看AbstractDALFactory类中的ChooseFactory方法,:
加入增添mysql数据库的工厂,那么需要修改此处程序,添加一个case 分值。虽然改动很少,但不通用啊。为了省事,偷懒。此处代码利用反射技术来实现,可谓省了不少功夫,不过以后的不管添加何种类型的数据库,都不会修改此处代码。public static AbstractDALFactory ChooseFactory() { string dbType = ConfigurationManager.AppSettings["DBType"].ToString(); AbstractDALFactory factory = null; switch(dbType) { case "Sql": factory = new SqlDALFactory(); break; case "Access": factory = new AccessDALFactory(); break; case "Oracle": factory = new OracleDALFactory(); break; } return factory; }
修改此处代码如下所示:(记得引入System.Reflection空间)
此为修改一也。public abstract class AbstractDALFactory { public abstract IAdminService CreateAdminService(); //此为命名空间,本人不知怎么获取,故在程序中写死了 private static readonly string assembly = "IDALFactory"; public static AbstractDALFactory ChooseFactory() { //获得程序中何种数据库 string dbType = ConfigurationManager.AppSettings["DBType"].ToString(); //拼接成类名 string className = assembly +"."+ dbType + "DALFactory"; AbstractDALFactory factory = null; //这就是很神奇的反射了 factory = (AbstractDALFactory)Assembly.Load(assembly).CreateInstance(className); return factory; } }
那么修改二在什么地方呢,不是已经用到了配置文件了吗 ?
是啊,我的意思是在数据访问层的连接字串的代码也放到配置文件(App.config)中,增强程序的健壮性,在修改维护过程中,如要更改数据库类型,只需修改配置文件即可,这是多么的省事啊,学会了以后工作就不用加班了啊。
贴上App.config配置文件的内容,上面加有注释,我就不再啰嗦了。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <!--选择使用何种数据库--> <add key="DBType" value="Access"/> <!--此为连接数据的连接字符串,可根据自己的实际进行修改,无需改动程序--> <!--在app文件中|DataDirectory|被解析为……\bin\debug这样的形式,即为debug目录下,故可以用相对路径--> <!--在web文件中|DataDirectory|被解析为……\App_Data这样的形式,即为App_Data目录下,故可以用相对路径--> <add key="Access" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\mydb.mdb"/> <add key="Sql" value="Data Source=SUNLIKE\SQLEXPRESS;Initial Catalog=blank;Persist Security Info=True;User ID=sa;Password=sa"/> <add key="Oracle" value="Data Source=mydb;Persist Security Info=True;User ID=heatdb;Password=heatdb"/> </appSettings> </configuration>
下面一OracleService类为例,看看是怎么实现的,添加显示的无参构造函数,便能实现。其他数据库类似,代码如下:
public AdminService() { connstr = ConfigurationManager.AppSettings["Oracle"]; conn = new OracleConnection(); }
好了,学习就到这里了,总结一下:
本例是通过配置文件 + 反射技术来实现 抽象工厂模式的。具体参考AbstractDALFactory的类。如果要更改连接数据库,请修改UIL项目中的App.config中
<add key="DBType" value="Sql"/>的value字段。如果修改连接字符串,怎修改下面
<add key="Access" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\mydb.mdb"/>
<add key="Sql" value="Data Source=SUNLIKE\SQLEXPRESS;Initial Catalog=blank;Persist Security Info=True;User ID=sa;Password=sa"/>
<add key="Oracle" value="Data Source=mydb;Persist Security Info=True;User ID=heatdb;Password=heatdb"/>
相应的记录即可,无需修改代码。
即便是以后项目实施以后,会生成配置文件的,到时候更改数据库,只需修改相应的配置文件即可。前提是该数据的访问代码都已经实现,否则即便是修改也无济于事啊。前提就是要有东西,没有东西怎么也没有用。
对了,附上本次程序的代码: http://download.csdn.net/source/3491352 请大家多多指教。
设计模式学习之抽象工厂模式(二)<反射+配置文件>
最新推荐文章于 2023-01-07 22:10:57 发布