Это хороший дизайн системы рабочего процесса? - PullRequest
5 голосов
/ 16 января 2009

Я нахожусь в процессе разработки системы, которая позволит мне представлять широкомасштабные задачи в виде рабочих процессов, которые представляют свои рабочие элементы с помощью метода IEnumerable. Намерение здесь состоит в том, чтобы использовать в C # механизм «yield», чтобы позволить мне написать псевдо-процедурный код, который система исполнения рабочего процесса может выполнить по своему усмотрению.

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

public override IEnumerable<WorkItem> Workflow() {
    // These would probably be injected from elsewhere
    var db = new DB();
    var emailServer = new EmailServer();

    // other workitems here

    var ci = new FindLowInventoryItems(db);
    yield return ci;

    if (ci.LowInventoryItems.Any()) {
        var email = new SendEmailToWarehouse("Inventory is low.", ci.LowInventoryItems);
        yield return email;
    }

    // other workitems here
}

CheckInventory и EmailWarehouse являются объектами, производными от WorkItem, который имеет абстрактный метод Execute (), который реализуют подклассы, инкапсулируя поведение для этих действий. Метод Execute () вызывается в среде рабочего процесса - у меня есть класс WorkflowRunner, который перечисляет Workflow (), оборачивает до и после события вокруг рабочего элемента и вызывает Execute между событиями. Это позволяет приложению-потребителю делать все, что ему нужно, до или после рабочих элементов, включая отмену, изменение свойств рабочего элемента и т. Д.

Выгода для всего этого, я думаю, заключается в том, что я могу выразить основную логику задачи через рабочие элементы, ответственные за выполнение работы, и я могу сделать это довольно простым, почти процедурным способом. Кроме того, поскольку я использую IEnumerable и синтаксический сахар C #, который его поддерживает, я могу составлять эти рабочие процессы - например, рабочие процессы более высокого уровня, которые потребляют и управляют вспомогательными процессами. Например, я написал простой рабочий процесс, который просто чередует два дочерних рабочих процесса.

У меня такой вопрос - выглядит ли подобная архитектура разумной, особенно с точки зрения ремонтопригодности? Похоже, что для меня достигнуто несколько целей - самодокументируемый код (рабочий процесс читает процедурно, поэтому я знаю, что будет выполняться на каких этапах), разделение задач (поиск предметов с низким запасом не зависит от отправки электронной почты на склад) и т.д. Кроме того, есть ли потенциальные проблемы с такой архитектурой, которую я не вижу? Наконец, пробовали ли вы это раньше - я просто заново открываю это?

Ответы [ 2 ]

2 голосов
/ 16 января 2009

Лично для меня это будет решение "купить до сборки". Я бы купил что-нибудь, прежде чем написать.

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

Вот несколько случайных идей:

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

Это выглядело бы как конечный автомат с состояниями, переходами, событиями и действиями.

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

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

Я бы не ожидал увидеть что-нибудь столь же жестко запрограммированное, как этот почтовый сервер. Я бы предпочел инкапсулировать это в EmailNotifier, чтобы я мог подключиться к событиям, которые этого требовали. Как насчет уведомления бипера? Или сотовый телефон? Blackberry? Та же архитектура, другой уведомитель.

Хотите включить обработчик для взаимодействия с человеком? Все рабочие процессы, с которыми я имею дело, представляют собой сочетание человеческой и автоматизированной обработки.

Ожидаете ли вы подключения к другим системам, таким как базы данных, другие приложения, веб-службы?

Это сложная проблема. Удачи.

0 голосов
/ 16 января 2009

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

Рабочий процесс * Поддержка 1004 * теперь является частью .Net framework и называется "Workflow Foundation (WF) ". Почти наверняка легче научиться пользоваться встроенной библиотекой, чем написать собственную, как отметил Даффимо в своем комментарии «купить перед сборкой».

Рабочие процессы выражены в XAML и поддерживаются дизайнером в Visual Studio. Существует три типа рабочих процессов (из Википедии, ссылка ниже)

  • Последовательный рабочий процесс (Обычно поток На основе графика, прогресс из одного этапа к следующему и не отступать)
  • Состояние Рабочий процесс машины (прогресс от «Состояние» - «Состояние», эти рабочие процессы являются более сложными и вернуться к предыдущий пункт, если требуется)
  • Рабочий процесс на основе правил (Реализован основанный на Sequential / StateMachine рабочий процесс. Правила диктуют прогресс рабочего процесса)

Википедия: Windows Workflow Foundation

MSDN: Начало работы с Workflow Foundation (WF)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...