用反射+配置文件实现数据访问程序

抽象工厂:

在程序的代码中写明要实例化哪一个数据库,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.

 

反射:

它的格式为:

Assembly,Load("程序集名称").CreateInstance("命名空间.类名称"),其中类名称为要实例化的"类名".

在程序顶端上写上using System,Reflection来引用Reflection.在更换数据库,把数据库变成一个字符串变量。

'常规的写法

IUser result=new SqlserverUser();

'反射的写法,得到要实例化的数据库
    Using System.Refletion

    IUser result=(IUser)Assembly.Load("抽象工厂的程序集名称").CreateInstance("抽象工厂模式的命名空间名称.SqlserverUser");


但是我们发现一个问题,反射的写法,其实也是指明了要实例化SqlserverUser对象,这样当我们想改变要实例化的数据的时候,同样也会去改程序,该如何去做 ,当我们改变数据库的时候不再用改变程序了呢?这事就需要有配置文件了。


配置文件:

配置文件是存在于UI层,名字为App.config,在程序打包发布后,认可以从安装包中找到该文件并加以修改,如果我们把数据库的更改写到配置文件里,这样在我们换数据库的时候,就不需要再改变程序了。 


机房的配置文件:

添加一个App.config文件,如下:

<appSettings>
    <add key="DBString" value="SqlServer"/>
    <add key="assName" value ="JFDAL"/>
</appSettings>

再添加引用System.configuration,并在程序开头增加using System.Configuration来读配置文件,由key找到对应的value的值,然后更改LoginFactory类的赋值代码。


机房工厂层的LoginFactory类

’工厂层,就是来确定连接数据库的类型,然后实例化,返回到接口。
Public Class LoginFactory
    '创建D层SqlServerUserDAL类的实例
    Public Shared Function CreateUserInfo() As IuserinfoDAL
        '通过读配置文件获得D层程序集的名称和命名空间的名称并赋值给所声明的对象strDB,每个类都在配置文件里对应一个key.
       
        Dim AssemblyName As String = System.Configuration.ConfigurationManager.AppSettings("assName")

    '下面这句是把key设成变量,然后在下面的方法中只用这个变量就可以应用到D层这个类了。数据库类型为Sqlserver,
        Dim strDB As String = System.Configuration.ConfigurationManager.AppSettings("DBString")

        Dim dalUserInfoName As String = AssemblyName & "." & strDB & "UserDAL" '声明要实例化的D层类的名称

        'CType是一个内连函数,将前面部分的表达式转换为后面的类型,下面是实例了SqlServerUserDAL类的一个实例来实现IuserinfoDAL接口。
         Return CType(Assembly.Load( AssemblyName).CreateInstance(dalUserInfoName), IDAL.IuserinfoDAL)
    End Function
End Class

假如我们想使用Access数据库怎么办?直接改配置文件就可以,直接把 <add key="DBString" value="SqlServer"/>改为 <add key="DBString" value="Access"/>就可以了。在程序打包发布后,仍可以从安装包中找到该文件并加以更改。根本不需要该程序了。


总结:

使用配置文件,我们就不需要再改变程序里的内容,用反射直接实例化实现接口的数据库,这样就解决了抽象工厂更改数据库时频繁更改程序的缺点。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 23
    评论
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诗琪小姐姐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值