Windows workflow foundation что это за программа и нужна ли она
Windows Workflow Foundation – для чего и в каких случаях применять
Помню, еще в университете перед реализацией любого алгоритма мы описывали его в виде блок схемы, и только после этого переходили непосредственно к кодированию. Workflow, как одна из парадигм программирования, на ряду с процедурным и объектно ориентированным подходами, как раз и позволяет нам визуально реализовать любой процесс, используя набор предопределенных функциональных блоков (Activity), при этом, избавляя от его последующего кодирования.
Библиотека WF, являясь одной из реализаций парадигмы Workflow, предоставляет следующие основные возможности:
— богатый набор функциональных блоков;
— расширение набора стандартных функциональных блоков пользовательскими;
— сохранение и возобновление экземпляров Workflow в процессе их исполнения;
— использование Workflow дизайнера в вашем приложении;
— интеграция с WCF;
— пошаговая диагностика непосредственно в Workflow дизайнере;
— и многое другое.
Как известно, каждой технологии своя область применения. Для определения необходимости использования WF при реализации конкретного алгоритма/процесса я применяю 3 критерия:
1. Реализация алгоритма/процесса постоянно меняется.
В нашей компании мы разработали подсистему Workflow, которая является ядром всех продуктов. Имея, к примеру, десятки клиентов наших продуктов, у которых десятки процессов, получаем сотни разных изменяющихся процессов.
2. Процесс/алгоритм имеет длительный срок выполнения.
В наших продуктах жизненный цикл процессов исчисляется днями и неделями. При этом, в случае сбоя или перегрузки сервера, процессы должны корректно возобновить и продолжить выполнение.
3. Нужно предоставить возможность изменения алгоритма/процесса конечному пользователю без вмешательства программиста.
Мы разработали свой собственный дизайнер, чтобы максимально упростить и облегчить редактирование процессов конечному пользователю (бизнес-аналитику). Это позволяет снять нагрузку с разработчиков. А возможность видеть и самим с легкостью менять свои процессы очень привлекательна для клиентов.
Таким образом, если актуально хотя бы одно из выше перечисленных требований, следует рассмотреть WF как возможный вариант реализации алгоритма/процесса.
В качестве ознакомительного примера использования WF я как раз и реализую Workflow процесс, который ответит на вопрос о целесообразности использования WF.
1. Создаю новый проект IsWWFUsefullSample используя шаблон Blank Solution:
2. Добавляю новый проект IsWWFUsefullSample.Activities используя шаблон Activity Designer Library:
3. Удаляю сущеcтвующий файл ActivityDesigner1.xaml и добавляю новый элемент используя шаблон Activity:
4. Открываю Activity в дизайнере и добавляю необходимые параметры типа Boolean:
— три входящих параметра соответствующих нашим критериям: IsLongRunning, IsChangeable, IsDesignerNecessary;
— один исходящий параметр для возврата результата: Result.
Стоит упомянуть, что на данный момент для описания выражений и типов внутри Workflow Activity можно использовать только синтаксис VB.Net. Обещают добавить поддержку С#.
6. Workflow процесс готов. Для его использования добавляю новое приложение IsWWFUsefullSample.TestClient на основании шаблона Workflow Console Application:
7. Удаляю файл Workflow1.xaml.
8. Добавляю ссылку на проект IsWWFUsefullSample.Activities.
9. Реализую Main метод. Он предлагает пользователю ответить на три вопроса, запускает процесс Workflow с полученными исходными данными и выводит результат вычисления.
namespace IsWWFUsefullSample.TestClient
<
using System;
using System.Activities;
using System.Collections.Generic;
using System.Linq;
using System.Text;
///
/// Console program class.
///
public class Program
<
///
/// Program starting point.
///
///
public static void Main(string[] args)
<
// Question answers
const string Yes = «yes»;
const string No = «no»;
var answers = new List < Yes, No >;
// Create new activity instance
var activity = new IsWWFUsefull();
var parameters = new Dictionary ();
do
<
Console.WriteLine(«Please, answer following questions to determine necessity of using WWF.»);
Console.WriteLine();
// Read activity input parameters
parameters[«IsLongRunning»] = ReadAnswer(«Is process/algorithm long running?», answers) == Yes;
parameters[«IsChangeable»] = ReadAnswer(«Is process/algorithm frequently changed?», answers) == Yes;
parameters[«IsDesignerNecessary»] =
ReadAnswer(«Do you need a visual designer for your process/algorithm?», answers) == Yes;
// Execute activity
var result = WorkflowInvoker.Invoke(activity, parameters);
// Show result
Console.WriteLine();
if ((bool)result[«Result»])
<
Console.WriteLine(«Use WWF!»);
>
else
<
Console.WriteLine(«You don’t need WWF but still can use it if you like it :).»);
>
Console.WriteLine(«———————————————————————«);
Console.WriteLine();
>
while (ReadAnswer(«Do you want to proceed?», answers) == Yes);
/// Answer text.
private static string ReadAnswer(string question, IList answers)
<
// Prepare answers prompting string
var answersString = new StringBuilder();
for (var i = 0; i a == text.ToLower()).FirstOrDefault();
>
while (answer == null);
10. Запускаю и тестирую приложение:
Исходники проекта можно загрузить здесь.
Всем удачных архитектурных решений и приятного кодирования!
Введение в Microsoft Workflow Foundation
Заинтересовались — читайте дальше.
Введение
Если оглянуться, то мир вокруг нас — это бесконечная череда сменяющих друг друга процессов. Мы сажаем зерно, оно прорастает, цветет, оставляет потомство, погибает. На его месте вырастает что-то новое. И так день за днем. Люди пытаются описать эти процессы, симулировать их на компьютере, придумывают что-то новое. Для этого создаются различные ментальные модели, которые упрощают описание повседневных процессов. Вводятся уровни абстракции. Например, придумали объектно-ориентированное программирование. С его помощью можно описывать объекты реального мира. Это легко и естественно. Достаточно посмотреть на вещь и в голове уже вырисовывается более или менее точная модель: какими свойствами обладает этот объект, какие действия может совершать.
Но объекты, которые никак не взаимодействуют между собой, не имеют никакого смысла. Жизнь — это движение, зачастую цикличное. С другой стороны в мире существует человек. Он вносит некоторую сумятицу своей разумностью. Многие вещи, которые он делает — непоследовательны. Мотивы не всегда ясны. Сроки не всегда соответствуют ожиданиям. Человек может о чем-то забыть, что-то сделать не так, как задумывал раньше. И в тоже время он тоже оперирует объектами. Будь то объекты реального мира, такие, как камни, цветы, вода, или виртуального: документы, информация, слова.
Именно для описания движения и взаимодействия объектов внутри программ создана технология Microsoft Workflow Foundation. Это связующее звено, которое позволяет создавать взаимодействия, связывающие объекты между собой или процессы, протекающие внутри самих объектов. Workflow Foundation (WF) разделяет все процессы на два основных типа: последовательные процессы (sequential) и процессы, основанные на состояниях (state machine).
Последовательные процессы
Последовательные процессы, в понимании WF, — это такие процессы, которые обычно происходят без вмешательства извне. Также, они занимают относительно немного времени. Хорошим примером такого процесса может послужить копирование файлов из одной папки в другую: мы задали папки в начале процесса, а потом в него не вмешиваемся до завершения. Т.е. это, по сути, отлаженный конвейер. Да, может что-то сломаться и потребовать каких-то действий, но это исключительные ситуации, которые обрабатываются отдельно.
Процессы, основанные на состояниях
Лучший пример процесса, основанного на состояниях, кроется в его переводе. State machine буквально означает государственный аппарат. Это такой процесс, который имеет множество состояний, которые в зависимости от различных событий могут переходить из одного в другое. Все это мы обычно видим в бюрократическом аппарате: государственная страховка, продажа квартиры и т.д. Требуются подписи различных чиновников, которые могут быть в отпуске или на больничном. Такой процесс может длиться очень долго: дни, недели, а то и месяцы. Именно для таких ситуаций создан state-machine workflow.
Что нам дает WF
Давайте теперь посмотрим, что нам дает WF. В первую очередь это наглядность. Все мы постоянно рисуем какие-то схемки, наброски. В более сложных случаях мы детально углубляемся в проектирование, например, рисуем временные диаграммы. Теперь мы можем перенести эти эскизы в Microsoft Visual Stuidio 2008 с помощью встроенного редактора. Вот как это выглядит:
Даже далекий от программирования человек сможет разобраться в том, что происходит на диаграмме.
Но все эти эскизы оторваны от действующей программы, никак с нею не взаимодействуют. Если нам надо изменить течение процесса, то необходимо открыть исходники, вспомнить места, в которых необходимо сделать изменения согласно новому эскизу. Эти задачи позволяет решить WF. Мы можем просто взять и перенести участок кода на другое место. Тут же его скомпилировать и сравнить с исходным вариантом.
Также использование WF помогает более наглядно представить работу системы. Выделить процессы, которые могут быть разделены на составляющие или наоборот, объединены. Также поддерживаются транзакционные системы: можно задать компенсирующий процесс для случая, когда что-то пошло не так. Этот процесс вернет систему в состояние, в котором она находилась до наступления ошибки.
Есть возможность опубликовать процесс в качестве сервиса или веб-сервиса, доступного через интернет. Более того, можно создать так называемый Durable web-service, который сохраняет идентификатор сессии и состояние сервиса в промежутках между вызовами, позволяя выполнять процесс в течение длительного времени, не поддерживая соединение. Вы даже можете остановить процесс, сохранить состояние и запустить его на другом компьютере с того же самого места.
Средства разработки
Наиболее удобным средством разработки является визуальный редактор, встроенный в Visual Studio 2008. Он позволяет быстро и гибко создавать и модифицировать процессы. При этом нет необходимости разбираться в том, как это устроено на низком уровне. Также можно создавать процессы, используя язык разметки XAML или при помощи C#.
Давайте взглянем на основные элементы интерфейса для работы с процессами в студии. Вот как выглядит окно в процессе разработки:
Рассмотрим назначение каждой панели.
Это основной документ, в котором мы моделируем процесс. Сейчас мы видим приглашение перетащить туда какие-нибудь элементы для создания последовательного процесса.
Процесс состоит из базовых элементов, называемых Activity. Они находятся в панели Toolbox под номером два. В ней находится множество элементов. Часть из них вполне понятна по их названию. Например, While или IfElse. ConditionedActivityGroup звучит более загадочно.
Естественно, понадобится панель Properties для настройки всевозможных параметров.
Также очень полезна панель Document Outline, обозначенная цифрой четыре. В ней отображается дерево элементов данного процесса, позволяющее быстро переходить от одного элемента к другому.
Заключение
WF предоставляет разработчику более высокий уровень абстракции при работе над проектом. Позволяет пробовать новые идеи, используя имеющиеся наработки. Вы можете создать библиотеку часто используемых процессов и их элементов для повторного применения в других проектах. В следующей статье мы познакомимся поближе с последовательными процессами на примере программы, осуществляющей резервное копирование файлов.
Обзор Windows Workflow Foundation на примере построения системы электронного документооборота [Часть 1]
Что такое WF
Windows Workflow Foundation (WF) — уже не новая технология компании Microsoft, разработанная для создания и выполнения потоков работ (Workflow). Однако на данный момент она используется не очень активно, а многие разработчики вообще не слышали про нее. И мое знакомство с ней произошло относительно недавно. Тогда как применение WF при реализации некоторых категорий задач может быть более чем оправданным. В связи с этим хочу рассказать о самой технологии, области ее применения и рассмотреть пример ее использования при реализации конкретного проекта.
Таким образом, в конечном итоге создание потока работ обычно сводится к составлению в дизайнере блок-схемы на основе Активностей базовой библиотеки в сочетании с Активностями собственной разработки. Поток работ, построенный в дизайнере, кодируется на языке XAML (расширение XML). Внешний вид дизайнера представлен на рисунке.
“Хорошо, но для чего это мне? — спросите вы. — Я лучше напишу килограмм кода, чем буду копаться с блоками и стрелками”.
Действительно, не с этого стоило начинать. Мы, разработчики, привыкли писать и читать код, хорошо это делаем и любим это делать. Код — компактнее. В коде мы можем оставлять комментарии. Изменения в коде легче отслеживать в системе контроля версий. Можно придумать еще 100500 аргументов, наверное. Но, оказывается, технология WF обладает следующими замечательными свойствами.
Во-первых, алгоритм, выраженный в виде схемы WF, может автоматически сохранять и восстанавливать свое состояние. Это не только освобождает нас от работы, но и открывает большие возможности по масштабированию нашего приложения. Лучше это показать на следующей картинке.
В момент А на первом компьютере поток работ доходит до точки, когда для продолжения работы требуются входные данные. Далее, происходит сохранение состояния (значений всех переменных, аргументов в указанной точке). Затем, спустя какой-то промежуток времени, поступают требуемые входные данные, и в момент Б происходит восстановление состояния, продолжение работы алгоритма с сохраненной точки на другом компьютере. Было бы замечательно, если бы таким свойством обладал любой код на C#, не правда ли?
Сейчас принято разделять логику на независимые участки кода. В частности, и для того, чтоб обеспечить масштабируемость. Для примера рассмотрим два метода: LogOn и GetData. Пока очевидно, что вначале вызывается метод LogOn, за ним — GetData. Но когда таких методов становится много, нам бывает сложно разобраться в логике (она может быть “размазана” по всему приложению) и порядке их выполнения. Использование WF снимает данную проблему: мы имеем разделенные задачи, которые связывает нить общего потока работ, отображаемого в виде простой для понимания блок-схемы, что даже неопытный разработчик сможет быстро разобраться в правилах запуска.
Нельзя применять WF без использования указанных выше преимуществ. В таком случае мы эксплуатируем недостатки технологии, несмотря и, может быть не понимая, достоинств. Это часто бывает при изучении новой технологии, но как многие думают, дополнительная строчка в резюме стоит трудозатрат работодателя на поддержку неуместного кода. Но, справедливости ради хочу сказать, что в таком случае польза от полученных знаний и навыков будет не очень велика, как мне кажется.
Когда к нам в команду поступила задача реализовать User Store типа: “Как директор, я хочу, чтобы в системе заявления на отпуск сотрудников согласовывались у непосредственного руководителя, затем поступали в отдел кадров для составления приказа, а приказ, после моей подписи, уходил бухгалтерию для начисления отпускных, чтобы исключить ошибки и задержки, уменьшить затраты”, — оказалось, что технология WF идеально подходит для ее реализации. При этом могут быть использованы все описанные выше возможности.
В следующей части рассмотрим практическую иллюстрацию применения WF на данном примере.
Программирование в Windows Workflow Foundation
этот раздел содержит набор разделов руководства, которые следует понимать, чтобы стать хорошо знакомым программистом Windows Workflow Foundation (WF).
в этом разделе
Проектирование рабочих процессов Разделы, описывающие парадигмы управления потоком, используемые при разработке рабочих процессов.
Использование и создание действий разделы, описывающие предоставляемые системой действия, доступные в Windows Workflow Foundation (WF).
модель данных Windows Workflow Foundation Разделы, описывающие переменные, аргументы и выражения в WF.
Ожидание входных данных в рабочем процессе Разделы, в которых описывается использование закладок и действий обмена сообщениями.
Исключения, транзакции и компенсация Разделы, описывающие использование обработчиков исключений, транзакций и компенсаций для обработки ошибок времени выполнения.
Рабочие процессы размещения Разделы, описывающие сведения о написании хост-приложений рабочих процессов.
Динамическое обновление Описывает, как использовать динамическое обновление для обновления определения рабочего процесса сохраненного экземпляра рабочего процесса.
Службы рабочих процессов Разделы, описывающие модель программирования, которая поддерживает декларативное написание служб.
Сохраняемость рабочего процесса Разделы, описывающие варианты автоматического или ручного сохранения данных рабочего процесса и выгрузки рабочих процессов из памяти.
Руководство по миграции разделы, описывающие перенос рабочих процессов из предыдущих версий Windows Workflow Foundation (WF).
Отслеживание и трассировка рабочих процессов Разделы, описывающие отслеживание и трассировку рабочих процессов, а также использование этих функций для мониторинга приложений рабочих процессов.
Безопасность рабочих процессов описывает, как обеспечить безопасность рабочего процесса при использовании SQL и Windows Communication Foundation (WCF).
производительность Windows Workflow Foundation 4 описывает Windows Workflow Foundation 4 и сравнивает их с предыдущей версией WF.
Общие сведения о Windows Workflow
Среда выполнения рабочих процессов
Каждый работающий экземпляр рабочего процесса создается и обслуживается внутрипроцессной подсистемой среды выполнения, с которой ведущий процесс взаимодействует с помощью одного из следующих инструментов:
WorkflowInvoker, который вызывает рабочий процесс как метод.
WorkflowApplication для явного управления выполнением одного экземпляра рабочего процесса.
WorkflowServiceHost для взаимодействия с помощью сообщений в многоэкземплярных сценариях.
Каждый из этих классов является оболочкой для среды выполнения основной операции, представленной как объект ActivityInstance, ответственный за выполнение операции. В домене приложения может быть несколько объектов ActivityInstance, работающих параллельно.
Компоненты рабочего процесса в хост-процессе
Взаимодействие между компонентами рабочего процесса
На следующей диаграмме показано взаимодействие компонентов рабочего процесса.
На предыдущей диаграмме используется метод Invoke класса WorkflowInvoker для вызова нескольких экземпляров рабочего процесса. WorkflowInvoker используется для упрощенных рабочих процессов, не требующих управления с сервера. Рабочие же процессы, требующие управления с сервера (например, возобновление Bookmark), должны выполняться с помощью Run. Чтобы вызвать экземпляр рабочего процесса, не обязательно ждать завершения другого. Среда выполнения допускает одновременное выполнение нескольких экземпляров рабочего процесса. Вызываются следующие рабочие процессы:
Действие Sequence, содержащее дочернее действие WriteLine. Переменная Variable родительского действия привязана к InArgument дочернего действия. Дополнительные сведения о переменных, аргументах и привязке см. в разделе переменные и аргументы.
Настраиваемое действие, происходящее от абстрактного класса CodeActivity. CodeActivity может обращаться к возможностям среды выполнения (например, к отслеживанию и свойствам) с помощью CodeActivityContext, доступного в качестве параметра метода Execute. Дополнительные сведения об этих функциях времени выполнения см. в разделе Отслеживание рабочего процесса и Свойства выполнения рабочего процесса.