2009-08-22 57 views
3

在ASP.NET Web應用程序,事件在particluar順序觸發:C#-Pipeline樣式的事件模型

爲簡單起見負荷=>驗證=>回傳=>渲染

假設我想開發這種管道-styled事件

實施例:

事件1 [ 「Audiance正在收集」,專家{事件2和事件3請等待,直到i信號}]

事件1之後完成了它任務

事件2 [{事件2,事件3「Audiance雲集!我的任務是在}]

事件2接管控制執行任務

事件2事件3請等到i信號]之後

「Audiance中記錄」事件2做完了任務

.....

事件3 「演示通過喬恩斯基特是在:)」]

用很基礎的例子可以有人解釋一下,我怎麼設計這個?

回答

0

一個非常簡單的解決方案,這也是近究竟在ASP.NET情況:

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

此示例顯示如何在處理程序列表中採用簡單的抽象類和簡單擴展方法,並實現您正在討論的管道模型。這當然是一個簡單的例子,因爲我只是將它作爲事件數據傳遞給一個字符串。但你顯然可以定製以適應你的情況。

擴展方法RaiseEvent枚舉處理程序列表並在處理程序上調用Handle方法以通知它該事件。

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");