您的位置:首页 > 数据库

三层架构之抽象工厂加反射——实现数据库转换

2011-03-25 10:23 656 查看
在做系统的时候有意识的用到了抽象工厂这个设计模式,主要解决的是数据库更换的问题。下面就以简单的登录来逐步的分析一下这个模式。
经典的三层架构数据库如下1.一般的数据库连接方式
界面层
PublicClassLogin
[code]PrivateSubbtnLogin_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesbtnLogin.Click
DimLUserAsNewEntity.User
DimBCheckAsNewBLL.B_Login
LUser.User_ID=txtName.Text
LUser.User_Pwd=txtPwd.Text
IfBCheck.Check(LUser)=TrueThen
MsgBox("登录成功!")
Else
MsgBox(“"登录失败!")
EndIf
EndSub
PrivateSubbtnCancle_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesbtnCancle.Click
End
EndSub
EndClass
[/code]业务逻辑层
PublicClassB_Login
[code]FunctionCheck(ByValUserAsEntity.User)AsBoolean
DimDaUserAsNewDAL.D_UserInfo
DimBlUserAsNewEntity.User
Bluser.User_ID=User.ID
BlUser=DaUser.Check(BlUser)
IfBlUser.User_Pwd=User.User_PwdThen
ReturnTrue
Else
ReturnFalse
EndIf
EndFunction
EndClass
[/code]数据持久层
ImportsSystem.Data.SqlClient
[code]PublicClassD_UserInfo
DimConnStrAsString="DataSource=******;InitialCatalog=Student;UserID=sa;Password=******"
DimconnAsSqlConnection=NewSqlConnection(ConnStr)
FunctionCheck(ByValUserAsEntity.User)AsEntity.User
DimsqlAsString="select*fromUserInfowhereUserInfo="&User.User_ID
DimcmdAsSqlCommand=NewSqlCommand(sql,conn)
DimreadAsSqlDataReader
Try
conn.Open()
read=cmd.ExecuteReader
User.User_ID=read.Item(0)
User.User_Pwd=read.Item(1)
ReturnUser
CatchexAsException
User.User_Pwd=""
ReturnUser
EndTry
EndFunction
EndClass
[/code]2.简单工厂
添加一个工厂类和一个接口接口类
PublicInterfaceIUserInfo
[code]FunctionCheck(ByValIUserAsEntity.User)AsEntity.User
EndInterface
[/code]工厂类
Imports[Interface]
[code]PublicClassDFactory
'DimDataBaseAsString="Access"
DimDataBaseAsString="Sql"
FunctionCreateUserInfo()AsIUserInfo
DimDBAsIUserInfo
SelectCaseDataBase
Case"Sql"
DB=NewD_UserInfoSql
'Case"Access"
'DB=NewD_UserInfoAccess
EndSelect
ReturnDB
EndFunction
EndClass
[/code]当然D_UserInfoSql实现接口,代码基本不变当有新的数据库使用时候(例如Access数据库)可以将工厂中的注释部分添上,然后重新写Dal层就可以直接使用,但是这样的不足是还是需要再次编译工厂,利用反射可以解决这个问题。
3.抽象工厂加反射
工厂类
Imports[Interface]
[code]ImportsSystem.Reflection
PublicClassDFactory
'抽象工厂加反射
DimDBStringAsString=System.Configuration.ConfigurationSettings.AppSettings("DBString")
FunctionCreateUserInfo()AsIUserInfo
ReturnCType(Assembly.Load("DAL").CreateInstance("DAL.D_UserInfo"&DBString),IUserInfo)
EndFunction
EndClass
[/code]数据持久层
ImportsSystem.Data.SqlClient
[code]PublicClassD_UserInfoSql:Implements[Interface].IUserInfo
'DimConnStrAsString="DataSource=******;InitialCatalog=Student;UserID=sa;Password=******"
DimConnStrAsString=System.Configuration.ConfigurationSettings.AppSettings("ConnStr")
DimconnAsSqlConnection=NewSqlConnection(ConnStr)
PublicFunctionCheck(ByValIUserAsEntity.User)AsEntity.UserImplements[Interface].IUserInfo.Check
DimsqlAsString="select*fromUserInfowhereUserInfo="&IUser.User_ID
DimcmdAsSqlCommand=NewSqlCommand(sql,conn)
DimreadAsSqlDataReader
Try
conn.Open()
read=cmd.ExecuteReader
IUser.User_ID=read.Item(0)
IUser.User_Pwd=read.Item(1)
ReturnIUser
CatchexAsException
IUser.User_Pwd=""
ReturnIUser
EndTry
EndFunction
EndClass
[/code]配置文件
<appSettings>
[code]<addkey="ConnStr"value="DataSource=******;InitialCatalog=Student;UserID=sa;Password=******"></add>
<addkey="DBString"value="Sql"></add>
</appSettings>
[/code]添加两个Key,一个是连接数据库的字符串,一个是通过反射来产生不同数据库的Dal层的这样一来就可以实现设计模式中的“开闭原则”,如果更换数据库只需要增加类(DAL),而不需要更改,更不需要重新编译。PS:配置文件必须在界面层1、反射的写法:objType=Assembly.Load(AssemblyPath).CreateInstance(className);其中:AssemblyPath指程序集名。className指命名空间.类名称。2、反射的一个原则:一切皆以UI层的bin文件夹中的dll名称为中心。(原因很简单:.net类加载的机制就是默认从本程序集的bin文件中找,所以bin文件夹中一定要有要加载的程序集的dll)。UI层中bin文件夹中dll叫什么名字AssemblyPath就使用什么名字,bin内部类的全名叫什么,className就写成什么全名。.net中的引用:加入对某个程序集的引用就能在程序集有变化时自动拷贝dll。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐
章节导航