Обзор Windows Workflow Foundation на примере построения системы электронного документооборота

Часть 1. Что такое WF

Windows Workflow Foundation (WF) — уже не новая технология компании Microsoft, разработанная для создания и выполнения потоков работ (Workflow). Однако на данный момент она используется не очень активно, а многие разработчики вообще не слышали про нее. И мое знакомство с ней произошло относительно недавно. Тогда как применение WF при реализации некоторых категорий задач может быть более чем оправданным. В связи с этим хочу рассказать о самой технологии, области ее применения и рассмотреть пример ее использования при реализации конкретного проекта.


Ключевым понятием в WF является Активность (Activity) — класс выполняющий единицу работы в среде выполнения WF. Термины Поток работ и Активность являются синонимами в контексте WF. Каждая Активность выполняет какое-либо действие — буквально программный код (например, на языке C#). Активности имеют входные и выходные параметры, переменные. Активность может представлять собой композицию из нескольких дочерних Активностей, в таком случае в процессе работы родительская Активность управляет запуском своих дочерних элементов в среде выполнения в соответствии со своей внутренней логикой. Например, Активность Parallel из базовой библиотеки Активностей (входит в поставку .NET Framework) запускает дочерние элементы параллельно. А поток работ If, как не сложно догадаться из названия, запускает один из двух дочерних элементов в зависимости от результата проверки заданного условия.

Таким образом, в конечном итоге создание потока работ обычно сводится к составлению в дизайнере блок-схемы на основе Активностей базовой библиотеки в сочетании с Активностями собственной разработки. Поток работ, построенный в дизайнере, кодируется на языке XAML (расширение XML). Внешний вид дизайнера представлен на рисунке.


“Хорошо, но для чего это мне? — спросите вы. — Я лучше напишу килограмм кода, чем буду копаться с блоками и стрелками”.

Действительно, не с этого стоило начинать. Мы, разработчики, привыкли писать и читать код, хорошо это делаем и любим это делать. Код — компактнее. В коде мы можем оставлять комментарии. Изменения в коде легче отслеживать в системе контроля версий. Можно придумать еще 100500 аргументов, наверное. Но, оказывается, технология WF обладает следующими замечательными свойствами.

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


В момент А на первом компьютере поток работ доходит до точки, когда для продолжения работы требуются входные данные. Далее, происходит сохранение состояния (значений всех переменных, аргументов в указанной точке). Затем, спустя какой-то промежуток времени, поступают требуемые входные данные, и в момент Б происходит восстановление состояния, продолжение работы алгоритма с сохраненной точки на другом компьютере. Было бы замечательно, если бы таким свойством обладал любой код на C#, не правда ли?

Сейчас принято разделять логику на независимые участки кода. В частности, и для того, чтоб обеспечить масштабируемость. Для примера рассмотрим два метода: LogOn и GetData. Пока очевидно, что вначале вызывается метод LogOn, за ним — GetData. Но когда таких методов становится много, нам бывает сложно разобраться в логике (она может быть “размазана” по всему приложению) и порядке их выполнения. Использование WF снимает данную проблему: мы имеем разделенные задачи, которые связывает нить общего потока работ, отображаемого в виде простой для понимания блок-схемы, что даже неопытный разработчик сможет быстро разобраться в правилах запуска.

Следующая совсем уже прикладная особенность WF, которую не стоило бы обходить вниманием — это возможность вынести программную логику в область конфигурации системы, если необходима такая гибкость. То есть, из компонентов стандартной поставки .NET Framework можно собрать дизайнер в рамках своего программного продукта. На этапе настройки системы происходит модификация потоков работ, управление их свойствами (например, условиями запуска). Далее, при эксплуатации в нужных точках выполняется не “хард-код”, а созданные ранее Активности. Таким образом, WF в сочетании с Dynamic LINQ является мощным инструментом для придания системе такого качества, как настраиваемость. Но, конечно, нельзя сказать, что для настройки такой системы вообще не потребуются навыки .NET программирования.

Важно, чтобы применение какого-либо фреймворка было действительно оправдано. Классический пример анти-паттерна необоснованного применения технологии я наблюдаю в текущем проекте в приложении, реализованном стороной заказчика своими силами. В нем используется схема WF фактически в качестве замены коду на C#, которая в итоге к тому же сильно деградировала вследствие незнания технологии всеми разработчиками, производившими модификацию. Но надо сказать, что получившийся “франкенштейн” неспешно, но все же выполняет возложенные на него обязанности1.

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

Когда к нам в команду поступила задача реализовать User Store типа: “Как директор, я хочу, чтобы в системе заявления на отпуск сотрудников согласовывались у непосредственного руководителя, затем поступали в отдел кадров для составления приказа, а приказ, после моей подписи, уходил бухгалтерию для начисления отпускных, чтобы исключить ошибки и задержки, уменьшить затраты”, — оказалось, что технология WF идеально подходит для ее реализации. При этом могут быть использованы все описанные выше возможности.

В следующей части рассмотрим практическую иллюстрацию применения WF на данном примере.

______________

1В проекте используется устаревший WF 3.0. Известно, что в рамках .NET Framework 4.0 WF был полностью переписан Microsoft в новом пространстве имен. Оптимизация производительности — одно из улучшений.

ссылка на оригинал статьи http://habrahabr.ru/company/luxoft/blog/181562/

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *