3

在 ASP.NET Web 应用程序中,事件以特定顺序触发:

为简单起见 加载 => 验证 => 回发 => 渲染

假设我想开发这样的管道式事件

例子 :

事件 1 [“观众正在聚集”,伙计们{事件 2 和事件 3 请等到我发出信号}]

事件 1 完成任务后

事件2 [{事件2,事件3“听众聚集!我的任务结束了}]

事件 2 正在接管控制权以执行其任务

事件 2 [“观众正在登录”事件 3 请等到我发出信号]

事件 2 完成任务后

......

活动 3 [“Jon skeet 的演讲结束 :)”]

任何人都可以通过非常基本的示例来解释,我该如何设计这个?

4

3 回答 3

1

Windows Workflow Foundation 就是为此而设计的。这里有 2 个截屏视频,你可以看看如何实现这样的东西。

http://blog.wekeroad.com/mvc-storefront/mvcstore-part-19a/

http://blog.wekeroad.com/mvc-storefront/mvcstore-part-21/

于 2009-08-22T18:13:51.627 回答
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");
于 2009-08-22T15:55:28.410 回答
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();    
    }
}
于 2009-08-22T18:20:20.273 回答