设计模式学习之抽象工厂模式(二)<反射+配置文件>

接上一篇文章《设计模式学习之抽象工厂模式(实现数据访问层)》继续学习,抽象工厂模式,本文在上一篇文章(对应程序为1.0,本文对应的程序为2.0版本)的基础之上上进行了改进。当然程序也升级为2.0版本啦。废话不多说,学习。

在1.0版本的程序中,大家看AbstractDALFactory类中的ChooseFactory方法,:

       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;
        }
加入增添mysql数据库的工厂,那么需要修改此处程序,添加一个case 分值。虽然改动很少,但不通用啊。为了省事,偷懒。此处代码利用反射技术来实现,可谓省了不少功夫,不过以后的不管添加何种类型的数据库,都不会修改此处代码。

修改此处代码如下所示:(记得引入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     请大家多多指教。 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值