从 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 删除依赖注入数据库对象接口连接