2009-08-22 4 views
3

In ASP.NET Web Apps, Ereignisse werden in particluar Reihenfolge ausgelöst:C# -Pipeline Stil Ereignismodell

der Einfachheit halber Load => Validierung => Postback => Rendering

Angenommen, ich möchte entwickeln solche Pipeline -styled Ereignis

Beispiel:

Ereignis 1 [ "audiance sammeln", Typen {Ereignis 2 und Ereignis 3 Bitte warten, bis das Signal i}]

012.

nach Ereignis 1 beendete es

Ereignis 2 [{Ereignis 2, Ereignis 3 „audiance gesammelt Aufgabe! Meine Aufgabe ist es über}]

Ereignis 2 wird über die Steuerung nimmt seine Aufgabe

Ereignis 2 [to perform "audiance werden Anmelden bei" Ereignis 3, bitte warten, bis ich das Signal]

nach Ereignis 2 beendet es Task

.....

Ereignis 3 [ "Präsentation von Jon Skeet ist vorbei :)"]

Mit sehr einfachen Beispiel kann jemand erklären, wie kann ich das entwerfen?

Antwort

0

Eine sehr einfache Lösung, das ist auch in der Nähe zu dem, was in ASP.NET tatsächlich passiert:

class EventChain 
{  
    public event EventHandler Phase1Completed; 
    public event EventHandler Phase2Completed; 
    public event EventHandler Phase3Completed; 

    protected void OnPhase1Complete() 
    { 
     if (Phase1Completed != null) 
     { 
      Phase1Completed(this, EventArgs.Empty); 
     } 
    } 

    public void Process() 
    { 
     // Do Phase 1 
     ... 
     OnPhase1Complete(); 

     // Do Phase 2 
     ... 
     OnPhase2Complete();  
    } 
} 
0

Dieses Beispiel zeigt, wie Sie eine einfache abstrakte Klasse und eine einfache Erweiterungsmethode für eine Liste von Handlern verwenden und das Pipeline-Modell implementieren, von dem Sie sprechen. Dies ist natürlich ein trivialisiertes Beispiel, da ich einfach eine Zeichenfolge als Ereignisdaten übergebe. aber Sie können natürlich anpassen, um Ihre Situation anzupassen.

Die Erweiterungsmethode RaiseEvent zählt die Liste der Handler auf und ruft die Methode Handle auf dem Handler auf, um sie über das Ereignis zu informieren.

public abstract class Handler 
{ 
    public abstract void Handle(string event); 
} 

public static class HandlerExtensions 
{ 
    public static void RaiseEvent(this IEnumerable<Handler> handlers, string event) 
    { 
    foreach(var handler in handlers) { handler.Handle(event); }  
    } 
} 

... 

List<Handler> handlers = new List<Handler>(); 
handlers.Add(new Handler1()); 
handlers.Add(new Handler2()); 

handlers.RaiseEvent("event 1"); 
handlers.RaiseEvent("event 2"); 
handlers.RaiseEvent("event 3");