从 VFP 的角度看 .NET 中的依赖注入和接口(2)
首先,我们分析一下 MyWork 类:在创建类实例时,依据传入的不同参数构建不同的数据库 ODBC 连接字符串获取有效的连接句柄并保持在类的属性中。
如果对描述进行抽象,那么 MyWork 类大致应该修改成这样:
代码语言:javascript代码运行次数:0运行复制Define Class MyWork As Custom
*!* 连接句柄属性,初始值为 -1,表示未连接
nStatementHandle = -1
*!* 存储建立连接的对象
oConnectObj = .null.
Procedure Init(tConnectObj As Custom)
This.oConnectObj = tConnectObj
This.nStatementHandle = This.oConnectObj.CreatConnection()
EndProc
EndDefine
这样,看上去 MyWork 类工作的机制就是在属性中存储一个 ConnectObj 对象,并调用其 CreatConnection() 方法建立连接,置于 ConnectObj 对象的连接方法是连接 SQL Server 还是 MySQL 亦或是其他数据库,MyWork 类是不关心的,但是只要创建 ConnectObj 实例,那么,就应该可以建立连接。
所以,我们需要针对不同的数据库创建几个类:
代码语言:javascript代码运行次数:0运行复制Define Class SQLServer As Custom
*!* 创建数据库连接
Procedure CreatConnection() As Number
Local cConnectString As String, nStatementHandle As Number
m.cConnectString = "Driver={SQL Server};UID=sa;PWD=你的密码;Server=你的IP地址;Database=你的数据库"
m.nStatementHandle = Sqlstringconnect(m.cConnectString, .T.)
Return m.nStatementHandle
Endproc
EndDefine
Define Class MySQL As Custom
*!* 创建数据库连接
Procedure CreatConnection() As Number
Local cConnectString As String, nStatementHandle As Number
m.cConnectString = "Driver={MySQL ODBC 8.0 ANSI Driver};UID=root;PWD=你的密码;Server=你的IP地址;Database=你的数据库;Port=你的端口"
m.nStatementHandle = Sqlstringconnect(m.cConnectString, .T.)
Return m.nStatementHandle
Endproc
EndDefine
Define Class Access As Custom
*!* 创建数据库连接
Procedure CreatConnection() As Number
*!* 相应的代码
Endproc
EndDefine
Define Class Oracle As Custom
*!* 创建数据库连接
Procedure CreatConnection() As Number
*!* 相应的代码
Endproc
EndDefine
Define Class PostgreSQL As Custom
*!* 创建数据库连接
Procedure CreatConnection() As Number
*!* 相应的代码
Endproc
EndDefine
......
看上去这些类似乎都是一个样子,就好像是基于一个模板创建的:
代码语言:javascript代码运行次数:0运行复制Define Class template As Custom
*!* 创建数据库连接
Procedure CreatConnection() As Number
Endproc
EndDefine
好了。到这里,基本就结束了。
最后设计的模板类,在 .NET 中被称之为接口。
MyWork 类的运行需要依赖 SQLServer类、MySQL类......在代码中将这些类实例传递给 MyWork 类的行为在 .NET 中被称之为注入。
在 VFP 中完整的代码如下:
代码语言:javascript代码运行次数:0运行复制Local ConnectString As template
m.ConnectString = CreateObject("SQLServer")
Local MyWork As MyWork
m.MyWork = CreateObject("MyWork", m.ConnectString)
? m.MyWork.nStatementHandle
Define Class MyWork As Custom
*!* 连接句柄属性,初始值为 -1,表示未连接
nStatementHandle = -1
*!* 存储建立连接的对象
oConnectObj = .null.
Procedure Init(tConnectObj As Custom)
This.oConnectObj = tConnectObj
This.nStatementHandle = This.oConnectObj.CreatConnection()
EndProc
EndDefine
Define Class SQLServer As template
*!* 创建数据库连接
Procedure CreatConnection() As Number
Local cConnectString As String, nStatementHandle As Number
m.cConnectString = "Driver={SQL Server};UID=sa;PWD=你的密码;Server=你的IP地址;Database=你的数据库"
m.nStatementHandle = Sqlstringconnect(m.cConnectString, .T.)
Return m.nStatementHandle
Endproc
EndDefine
Define Class MySQL As template
*!* 创建数据库连接
Procedure CreatConnection() As Number
Local cConnectString As String, nStatementHandle As Number
m.cConnectString = "Driver={MySQL ODBC 8.0 ANSI Driver};UID=root;PWD=你的密码;Server=你的IP地址;Database=你的数据库;Port=你的端口"
m.nStatementHandle = Sqlstringconnect(m.cConnectString, .T.)
Return m.nStatementHandle
Endproc
EndDefine
Define Class Access As template
*!* 创建数据库连接
Procedure CreatConnection() As Number
*!* 相应的代码
Endproc
EndDefine
Define Class Oracle As template
*!* 创建数据库连接
Procedure CreatConnection() As Number
*!* 相应的代码
Endproc
EndDefine
Define Class PostgreSQL As template
*!* 创建数据库连接
Procedure CreatConnection() As Number
*!* 相应的代码
Endproc
EndDefine
Define Class template As Custom
*!* 创建数据库连接
Procedure CreatConnection() As Number
Endproc
EndDefine
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-03-31,如有侵权请联系 cloudcommunity@tencent 删除依赖注入数据库对象接口连接
发布评论