抽象工厂:
在程序的代码中写明要实例化哪一个数据库,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.
反射:
它的格式为:
Assembly,Load("程序集名称").CreateInstance("命名空间.类名称"),其中类名称为要实例化的"类名".
在程序顶端上写上using System,Reflection来引用Reflection.在更换数据库,把数据库变成一个字符串变量。
'常规的写法
IUser result=new SqlserverUser();
'反射的写法,得到要实例化的数据库
Using System.Refletion
IUser result=(IUser)Assembly.Load("抽象工厂的程序集名称").CreateInstance("抽象工厂模式的命名空间名称.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"/>就可以了。在程序打包发布后,仍可以从安装包中找到该文件并加以更改。根本不需要该程序了。
总结:
使用配置文件,我们就不需要再改变程序里的内容,用反射直接实例化实现接口的数据库,这样就解决了抽象工厂更改数据库时频繁更改程序的缺点。