代码之家  ›  专栏  ›  技术社区  ›  Jonathan

VBScript(经典)ASP中的单例模式

  •  1
  • Jonathan  · 技术社区  · 17 年前

    Github project

    然而,在我的实现中,我必须创建一个全局文件来存储类实例。

    我不知道如何创建静态方法,因此在这种语言中使用单例模式。

    3 回复  |  直到 17 年前
        1
  •  6
  •   Michal    17 年前

    您可以通过将实例添加到 application object

    以下代码应对此进行演示:

    <%
    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()
    %>
    

    重要: 上面的例子只是一个模拟你如何做到这一点。

        2
  •  0
  •   Joost Moesker    17 年前

    事实上,有些人认为单身是反模式的。。。。

    您可以将该类重命名为 cFireASP ,使 日志 方法调用默认函数并创建一个全局函数 实例在您的include文件中。这为您提供了相同的API,其优点是您可以传递对周围FALog实例的引用。

    要进一步解耦您的应用程序,您可以将此实例的实例关联放到服务定位器中。这样,其他类就不必直接引用各种全局实例,从而为您提供了另一个seam来分离接口和实现。

    提示:在类中引用响应对象会使单元测试变得困难。使用依赖注入或所述servicelocator将类与其全局环境分离。

    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)
    ....
    
        3
  •  0
  •   Gerardo Lima    16 年前

    因为我不认为VBScript语言构造可以做到这一点 自然的 使用类时,我宁愿使用以下两种方法之一:


    为应用程序范围的OnStart事件创建处理程序,然后加载该类的单个实例并将其分配给应用程序变量。由于此事件是应用程序启动时运行的第一个代码,因此您可以假定实例将一直被加载。

    aproach的优点是不需要在将使用sigleton对象的页面上包含任何文件(作为应用程序。上下文可用于所有ASP文件):
    在中创建singleton实例 Global.asa

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

    在“”中使用singleton实例 anyfile.asp ":

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

    2.使用函数访问singleton对象

    创建一个函数以返回singleton变量。如果obejct已经分配给aplication.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
    

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

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