Как получить данные из рабочего процесса конечного автомата до того, как рабочий процесс войдет в завершенное состояние? - PullRequest
2 голосов
/ 14 мая 2009

Я работаю с рабочим процессом конечного автомата и использую службу ExternalDataExchange для обработки событий на хосте и получения данных в рабочий процесс с помощью аргументов событий.

Однако теперь мне нужно вывести данные из рабочего процесса, и у меня возникают трудности.

Выходные параметры доступны только в случае завершения рабочего процесса, но мой рабочий процесс не завершен. Хост запускает событие с некоторыми данными и в основном ожидает, пока рабочий процесс завершит обработку события (ручной планировщик). В моей конкретной обработке события в рабочем процессе он выполняет некоторую проверку и, если проверка не удалась, он НЕ переходит в следующее состояние, но мне нужно иметь возможность отправлять результаты проверки обратно в хост-приложение.

Пример того, что я пытаюсь выполнить, выглядел бы так:

OrderWorkflow
    PendingOrderState
        ImportOrderEvent
            - If the order passes validation move to CompletedState
            - Else return the validation results to the host (how?)
    CompletedState

Следует также отметить, что мой хост на самом деле является приложением ASP.NET MVC, поэтому я стараюсь избегать связывания событий на моем контроллере / странице напрямую для обработки локальных сервисов из рабочего процесса, вызывающего, но не полностью против этого, если это так, как это нужно сделать.

Ответы [ 2 ]

3 голосов
/ 14 мая 2009

Похоже, у меня есть рабочее решение для этого.

По сути, мой WorkflowRuntimeManager более или менее совпадает с представленным Брюсом Буковичем в его книге Pro WF Windows Workflow в .NET 3.5.

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

Это событие, в свою очередь, выбирается WorkflowRuntimeManager, где оно затем, в свою очередь, берет результаты и связывает их с соответствующим WorkflowInstance и где оно становится доступным для самого приложения после возврата метода Workflow.

Я прикрепил здесь реализацию сервиса для всех, кто хочет дублировать эту функцию. Или даже лучше, если кто-то может найти лучший способ сделать это, пожалуйста, дайте мне знать.

public interface ISendDataService
{
    event EventHandler<ReceivedDataEventArgs> ReceivedDataEvent;
    void SendData(Guid instanceId, IDictionary<string, object> data);
}

public class SendDataService : ISendDataService
{
    public event EventHandler<ReceivedDataEventArgs> ReceivedDataEvent;

    private void OnReceivedDataEvent(Guid instanceId, IDictionary<string, object> data)
    {
        if (ReceivedDataEvent != null)
            ReceivedDataEvent(null, new ReceivedDataEventArgs(instanceId, data));
    }

    public void SendData(Guid instanceId, IDictionary<string, object> data)
    {
        OnReceivedDataEvent(instanceId, data);
    }
}

public class ReceivedDataEventArgs : EventArgs
{
    public ReceivedDataEventArgs()
    {
    }

    public ReceivedDataEventArgs(Guid instanceId, IDictionary<string, object> data)
    {
        InstanceId = instanceId;
        Data = data;
    }

    public Guid InstanceId { get; set; }
    public IDictionary<string, object> Data { get; set; }
}
0 голосов
/ 08 июля 2009

Приведенное выше решение для ManuakWorkflowScheduler Service - синхронное выполнение?

...