透视和调整你的企业和商务系统(Ⅱ:COM+、ASP)

透视和调整你的企业和商务系统( Ⅱ : COM+ 、 ASP )


小气的神 2001-10-11

接着上一篇所说的三个过程中第一个步骤开始进行,环境需要两部机器,一部做 SQL Server ,一部做 App 和安装 IIS 。模拟现在常见的 Windows DNA 结构,在 ASP 中调用 Biz 组件。 VB 的 Client 端我就省略了,选择 IE 作为 Client 端,唯一想验证的是构架和组件是 OK 的就好了。

这一篇和 dotNET 还没有任何关系,因为那时还没有 dotNET 技术,为了更真实的模拟现实比如复杂一点带有事务要求的逻辑,我决定把 SQL Server 和组件放在两台机器上。

内容我选用 SQL Server 自带的 Pub 数据库的 Author 表作为原型。当我翻看原来的一些应用代码和组件发现整个的代码一般分为两类:一类是完成一个商业和业务逻辑的操作,带入必须的参数给 Biz 组件, Biz 组件调用其它 Biz 组件或 DB 组件完成需要的各种操作,然后返回一个简单的数据类型回来给表现层。比如一个 String 字符串(错误描述),一个 Long 型(表示某种流水号,什么编号或是错误代码等);另一类是查询或某种操作之后返回的大量数据,让我庆幸的是自己已经习惯了用 ADODB.Recordset 来返回这些大量数据,所以这一类很统一 , 一般都是 ADODB.Recordset 类型的返回值。除此之外连 Variant 都很少很少,自己定义的结构类型在 Biz 这一层的返回值中几乎为零。

对于 WebService 来说,数据被统一成 XML 的格式,我开始想象这些 ADODB.Recordset 在 XML 中会是什么模样的?客户端又如何使用这些 XML 格式的 ADO 数据呢?几乎第一个反应是用 Microsoft SOAP Toolkit 来解决这个问题,所以对 SOAP Toolkit 产生的 WSDL 文件充满好奇,想知道这种 ADODB.Recordset 返回值的 WSDL 会是怎样的。事实上,以后试验的结果让人泄气。不过问题更早的暴露出来了,就是这些自定义或说不是 SOAP 支持的数据类型的数据如何处理的问题,目前集中在 ADODB.Recorset 这种数据类型上。这些问题也就决定了要产生的 db 和 Biz 组件。

DB 组件没有特别的, Biz 组件我决定直接调用这些 DB 组件,先没有任何的逻辑,事实上 Biz 中可能是很复杂的,调用很多其它的 Biz 或 DB 组件,但往往它最后只会有一个结果:成功或失败,或是返回一组数据,也就是我上面归类的两种。所以我开始用类似的 Update,Delete 功能:

Public Function DeleteAuthor(ByVal au_id As String) As Long

来模拟第一类返回 SOAP 支持的单一数据类型的情况 , 现实的应用中可能会是:

Public Function ChangePaymentType( Byval nTypeID as Long, Byval Value as Integer) As Long 一个修改用户付款方式的商业逻辑。

用 Select 功能

Public Function GetAuthorsByName(ByVal fName As String, ByVal lName As String) As ADODB.Recordset 来模拟第二类返回不是基本数据类型的返回值,现实的应用中可能会是

Public Function GetCustomerInfoByID( Byval nCustomerID as Long ) As ADODB.Recordset 一个根据客户 ID 来获得客户资料的商业逻辑。

我列出后面用的最多的两个函数的代码,特别是这两个函数名会在后面被大量涉及到:

Biz 组件: bus_Authors.Authors ,编译成 DLL: bus_Authors.DLL

Public Function Version() As String

Version = "VB & SOAP ver 1.00 "

objCtx.SetComplete

End Function

Public Function GetAuthors() As ADODB.Recordset

On Error GoTo ErrHandler

Dim obj As Object

Set obj = CreateObject(dbcomName)

Set GetAuthors = obj.GetAuthors()

objCtx.SetComplete

Exit_Err:

Exit Function

ErrHandler:

Set GetAuthors = Nothing

objCtx.SetAbort

Err.Raise Err.Number, SetErrSource(modName, "GetAuthors"), Err.Description

Resume Exit_Err

End Function

db 组件: db_Authors.Authors ,编译成 DLL: db_Authors.DLL

Public Function GetAuthors() As ADODB.Recordset

On Error GoTo HandleError

Dim Rst As ADODB.Recordset

Dim strSql As String

Set Rst = newClientRstOnlyRead(5)

strSql = " SELECT * FROM Authors "

Rst.Open strSql, strConstruct, adOpenStatic, adLockReadOnly, adCmdText

If Not IsRstEmpty(Rst) Then

Set GetAuthors = Rst

Else

Set GetAuthors = Nothing

End If

objCtx.SetComplete

HandleExit:

Exit Function

HandleError:

objCtx.SetAbort

Set GetAuthors = Nothing

Err.Raise Err.Number, SetErrSource(modName, "GetAuthors"), Err.Description

Resume HandleExit

End Function

Version() 和 GetAuthors() 分别用来模拟上诉的两类返回值的情况,剩下的还包括下面的函数:

Public Function Echo(ByVal sEcho As String) As String

Public Function GetAuthorsByName(ByVal fName As String, ByVal lName As String) As ADODB.Recordset

Public Function DeleteAuthor(ByVal au_id As String) As Long

Public Function UpdateAuthorByAddress(ByVal au_id As String, ByVal sAddress As String) As Long

这些不同的是加入了参数,和上面的 Version 和 GetAuthors 返回值没有什么不同所以我后面只讨论 Version 和 GetAuthors 这两个函数,剩下的实现上只有稍稍不同。

完成后编译组件,安装在 Windows 2000 的 COM + 中,我建立了一个叫 Authors 的 Application 。然后利用 Component Services 分别将 Authors Application 用 Export... 功能倒出一个 Server Application 和 Application proxy 的安装包,后面我们会用上它们。如图:

然后设置好 IIS ,建立一个虚拟目录 Authors 写一个简单的 ASP 页面调用 bus_Authros.Authors 组件的 Version 和 GetAuthors 方法产生一个 Html 的输出 (VB 和 ASP 的客户端的测试代码我都省略了 ) 。保证 Http://localhost/Authors/TestAuthors.asp 或

Http://henrysvr/Authors/TestAuthors.asp 调用正常在 IE 中产生页面输出。

ComplusExport

TestAuthors.asp 放的物理的目录我假设是: C:\Inetpub\wwwroot\Authors 中,这个目录在下面的章节中还会涉及到并且存放我们的 WSDL 等文件。

如果上述一切 OK 那么基本上完成了第一步,有了一个简单的 Windows DNA 构架的例子使得下面的步骤可以开始进行,目前的构架可能象下面这样的:

AppSvr

另外防火墙都将不再考虑在内了,我没有模拟它。实际应用中防火墙是需要具体考虑的一个因素。


特别:

以上文字和图片涉及其他人的隐私和个人权利,如非被授权或经本人同意,任何网站或期刊请不要刊登、转载、改编、转贴或已其他形式进行传播。以上所有文字和图片只用于内部交流,不作任何新闻发表和商业用途。

Published At
Categories with Web编程
Tagged with
comments powered by Disqus