Dette er en overbygning på "Events i ASP", som tager skridtet videre og pakker tingene pænere ind. Hvis du ikke har læst artiklen om events - og callbacks i ASP, kan jeg da anbefale at kigge på dem først (selvom det ikke er noget krav for at forstå denne artikel).

Tidligere havde vi et sæt funktioner som satte events op via nogle offentligt tilgængelige kommaseparerede strenge. Dette er ikke særlig hensigtsmæssigt af flere årsager, så derfor vil jeg forsøge, at få teknikken omkring måden, hvorpå eventhandlers bliver håndteret, pakket lidt mere forsvarligt ind. Til dette formål vil jeg benytte klasser.

Jeg har oprettet en klasse som hedder CEventHook, hvor man kan tilmelde og afmelde en eventhandler, samt rejse et event. Klassen kommer til at se således ud:

class CEventHook
  private m_eventHook

  private sub class_initialize()
    m_eventHook = ""
  end sub
 
  sub raise(obj)
    dim arr, s
   
    arr = Split(m_eventHook, ",")    
    ' Udfør alle de eventhandlers som er koblet på det givne event...
    for each s in arr
      execute s & "(obj)"
    next
  end sub

  sub hookup(eventHandlerName)
    if len(m_eventHook) > 0 then
      m_eventHook = m_eventHook & ","
    end if
    m_eventHook = m_eventHook & eventHandlerName
  end sub

  sub unhook(eventHandlerName)
    dim rx
    set rx = new RegExp
    rx.Global = true
    rx.IgnoreCase = true
    rx.Pattern = "(?:^|,)" & eventHandlerName & "(,|$)"
    m_eventHook = rx.Replace(m_eventHook,"")
  end sub
end class

Der er ikke ændret noget på hvordan eventhandlers opbevares, men det er dejligt indkapslet og fuldstændig ligegyldigt for brugeren af et CEventHook, hvordan dette foregår, bare eventet bliver kaldt som det skal!

Det vi kan med denne klasse er f.eks.

set evBefore = new CEventHook
call evBefore.hookup("min_eventhandler")
call evBefore.raise(nothing)

altså opret et objekt af klassen CEventHook og tilmeld en eventhandler ved navn "min_eventhandler" og "kast" eventet, dvs. udfør alle de tilmeldte eventhandlers.

Den aktuelle implementering kalder eventhandleren med netop en parameter, derfor forventes eventhandleren at implementere netop en parameter i sin definition. En eventhandler skal altså altid tage netop en parameter, således:

sub min_eventhandler(obj)
  ' Gør hvad der nu skal gøres...
end sub

Dette kan så anvendes til at sende oplysninger om den "kastende" funktions tilstand eller til opsamling af parametre fra eventhandleren til den "kastende" funktion. En eventparameter-klasse kunne se således ud (men ikke nødvendigvis bundet til at se således ud):

class CEventParam
  private m_sender

  private sub class_initialize()
    set m_sender = nothing
  end sub

  public property get sender: set sender = m_sender: end property
  public property set sender(value): set m_sender = value: end property
end class

Hvor det så kunne være det objekt, hvorfra eventet bliver "kastet" der refereres til i "sender"-egenskaben. 

Da det typisk er objekter man forbinder events med, vil jeg give et eksempel på en klasse, der implementerer dette event-system. Så kan du se  hvordan jeg har tænkt det skulle fungere i praksis. Eksemplet er ikke specielt genialt og gennemtænkt, det er blot for at illustrere teknikken i at benytte events.

class CTestEvents
  private m_ehBefore
  private m_ehAfter
  
  private sub class_initialize()
    set m_ehBefore = new CEventHook
    set m_ehAfter = new CEventHook
  end sub

  public sub doSomething()
    dim params
    set params = new CEventParam
    set params.sender = me
    call ehBefore.raise(params)

    ' Gør så det der skal gøres herinde...

    call ehAfter.raise(params)
    set params = nothing
  end sub

  public property get ehBefore: set ehBefore = m_ehBefore: end property
  public property get ehAfter: set ehAfter = m_ehAfter: end property
end class

Dette objekt kunne så i sig selv benyttes således:

sub min_eventhandler(e)
  ' Gør et eller andet smart her når Before-eventet bliver kastet...
end sub

dim te
set te = new CTestEvents
call te.ehBefore.hookup("min_eventhandler")
call te.doSomething()

Det var idéen! Nu må du selv vurdere om det er værd at spilde serverresurser på, eller om det er lettere på den gammeldags måde... :-) 

 
Sidst opdateret: 10-09-2008 19:02:25
Tilmeld link | Tilføj Link | Tilføj Link | @-begynder
Erklæring om beskyttelse af personlige oplysninger

nope.dk - Danmarks Website Chart