簡體   English   中英

VBScript(經典)ASP中的單例模式

[英]Singleton Pattern in VBScript (Classic) ASP

我剛剛創建了FirePHP服務器端庫的Classic ASP版本,可與常規的舊FirePHP控制台一起使用。

參見Github項目

但是,在我的實現中,我必須創建一個全局變量來存儲類實例。

我什至不知道如何創建靜態方法,從而使用這種語言的單例模式。

您可以通過將實例添加到應用程序對象中來創建單例。 只要該Web應用程序正在運行,它就會在所有會話之間共享。

以下代碼應進行演示:

<%
class MySingleton
  public function getInstance()
    if not isObject(application("MySingleton")) then
      set application("MySingleton") = new MySingleton
    end if
    set getInstance = application("MySingleton")
  end sub
end class

'usage
set instance = (new MySingleton).getInstance()
%>

重要提示:上面的示例只是一個模擬操作方法。

實際上,Singleton被某些人視為反模式。

您可以將類重命名為cFireASP ,使log方法成為默認功能,並在您的包含文件中創建一個全局FALog實例。 這為您提供了相同的API,並具有可以將引用傳遞到FALog實例arround的優點。

為了進一步分離您的應用程序,您可以將該實例的實例放置到服務定位器中。 這樣,您的其他類就不必直接引用各種全局實例,從而為您提供了另一個接口來將接口與實現分開。

提示:您在類中引用了響應對象,這會使單元測試變得困難。 使用依賴注入或所述服務定位器將類與其全局環境分開。

class cSomePageController
  public env
  private response, session, application, server, db_conn
  private sub class_initialize 
    set response = env.response
    set session = env.session
    set application = env.application
    set server = env.server
    set db_conn = env.db_conn
  end sub

  public sub handle_request(request)
    ...
  end sub      
end class
...

set controller = new cSomePageController
set env = new ASPenv    
set controller.env = env
call controller.handle_request(env.request)
' Alternatieve configuration for testing using a mock objects
set mock_env = new MockEnv
set controller.env = mock_env
call controller.handle_request(mock_env.request)
....

由於我認為VBScript語言構造不會自然地與類一起使用,因此我希望使用以下兩種方法之一:

1.在Appliction_OnStart事件中創建單例對象,並將其加載到Application.Context變量中

為應用程序范圍的OnStart事件創建一個處理程序,然后加載該類的單個實例並將其分配給Application變量。 由於此事件是應用程序啟動時運行的第一個代碼,因此可以假定實例將始終被加載。

該方法的優點是不必在將使用sigleton對象的頁面上包含任何文件(因為Application.Context可用於所有ASP文件):
Global.asa創建單例實例

Sub Application_OnStart
  Set Application.Contents("MySingleton") = new MySingleton
End Sub

在“ anyfile.asp ”中使用單例實例:

Dim obj : Set instance = Application.Contents("MySingleton")
obj.doAnyMethod()

2.使用函數訪問單例對象

創建一個函數以返回單例變量。 如果對象已分配給Apllication.Context變量,則只需將其返回即可,如果尚未分配,則在返回之前先加載並賦值。

這種方法的優點在於,只有在首次使用實例時才創建該實例。 由於我總是通過#include指令加載on庫,所以這對我來說不是問題,將是我的首選方式。

創建函數以返回myLib.inc單例實例

Function GetSingleton
  If IsEmpty(Application.Contents("MySingleton")) Then
    Set Application.Contents("MySingleton") = new MySingleton
  End If
  Set GetSingleton = Application.Contents("MySingleton")
End Function

在“ anyfile.asp ”中使用單例實例: <!--#include virtual="/myLib.inc" -->

Dim obj : Set instance = GetSingleton()
obj.doAnyMethod()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM