C # -Pipeline Стиль модели событий - PullRequest
3 голосов
/ 22 августа 2009

В ASP.NET Web Apps события запускаются в определенном порядке:

для простоты Загрузка => Проверка => Обратная передача => Рендеринг

Предположим, я хочу разработать такое конвейерное событие

Пример:

Событие 1 ["Audiance собирают", ребята {Событие 2 и Событие 3 Пожалуйста, подождите, пока я не подам сигнал}]

после того, как событие 1 завершило свою задачу

Событие 2 [{Событие 2, Событие 3 ”Audiance собрался! Моя задача выполнена}]

Событие 2 берет на себя управление, чтобы выполнить свою задачу

Событие 2 [«Audiance is Logging in» Событие 3, пожалуйста, подождите, пока я не подам сигнал]

после того, как Событие 2 завершило свою задачу

.....

Событие 3 ["Презентация Джона Скита окончена :)"]

С очень простым примером кто-нибудь может объяснить, как я могу спроектировать это?

Ответы [ 3 ]

1 голос
/ 22 августа 2009

Windows Workflow Foundation предназначен именно для этого. Здесь есть 2 скринкаста, на которые вы можете посмотреть, как реализовать что-то подобное.

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

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

0 голосов
/ 22 августа 2009

Очень простое решение, которое также близко к тому, что на самом деле происходит в 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 голосов
/ 22 августа 2009

В этом примере показано, как вы можете взять простой абстрактный класс и простой метод расширения в списке обработчиков и реализовать модель конвейера, о которой вы говорите. Это, конечно, тривиальный пример, поскольку я просто передаю ему строку в качестве данных события. но вы, очевидно, можете настроить в соответствии с вашей ситуацией.

метод расширения 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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...