Интересная складывается ситуация: довольно долго при обсуждении возможностей будущей Windows Vista (которая тогда еще имела лишь кодовое обозначение Longhorn) речь шла главным образом о новой программной модели системы, которая тогда назвалась WinFX. По большому счету первое представление предварительной ознакомительной версии OC на PDC' 2003 прошло именно в таком ключе: "Longhorn — это WinFX" (см. "Нас ждут Longhorn, Yukon и Whidbey... и многое другое", «BYTE/Россия» № 1’2004).

Но с выпуском в мае прошлого года публичной второй бета-версии Windows Vista тема технологического набора WinFX, который как раз тогда получил официальное название .NET Framework 3.0, ушла в тень более широких обсуждений Windows с точки зрения работы пользователей (включая, конечно, и важные вопросы настройки и администрирования ОС). Ситуация не изменилась и сегодня, спустя три месяца после начала продаж Vista. И это вполне понятно: на данном этапе перед Microsoft и заказчиками стоит задача практического внедрения системы на пользовательском уровне.

Впрочем, нет сомнений, что в ближайшее время актуальность базовых программных инноваций Windows Vista опять будет быстро расти. В этом плане можно выделить два аспекта. Во-первых, использование фундаментальных новшеств будет все сильнее востребовано на уровне клиентских приложений — как тиражных продуктов, так и заказных решений. Во-вторых, сейчас начнется активный период подготовки к выпуску финальной версии Windows Server Longhorn, для которой возможности разработки весьма приоритетны.

В этой статье мы хотим вкратце познакомить читателей с одним из компонентов .NET Framework 3.0 — Windows Workflow Foundation (WF)*. По нашим наблюдениям, WF пока не стал объектом внимательного изучения ИТ-специалистами и разработчиками. Одна из причин этого в том, что данный программный компонент появился в составе .NET Framework 3.0 уже ближе к выпуску Vista (кажется, это было в августе 2005 г.). При этом в плане маркетингового продвижения этот продукт в силу его специфичности явно оставлен корпорацией Microsoft "на потом" (отметим, что технология управления идентификацией CardSpace появилась в .NET Framework 3.0 почти в самый последний момент, но учитывая актуальность вопросов безопасности, Microsoft прилагает большие усилия к ее популяризации).


*Microsoft сознательно использует сокращение WinWF или просто WF, а не WWF, чтобы его не путали с известной аббревиатурой World Wide Fund (Всемирный фонд охраны дикой природы).

Тем не менее WF — это интересно и перспективно, причем вовсе не в каком-то отдаленном будущем. Разумеется, речь не идет о том, что внутренний механизм Vista в своем нынешнем варианте может конкурировать с промышленными workflow-системами. Но тут нужно иметь в виду следующие обстоятельства.

1. Даже в таком начальном, клиентском, варианте (а в его развитии не стоит сомневаться) WinWF представляет реальный интерес для заказчиков и независимых разработчиков. И ряд российских софтверных вендоров уже начали включать его в свои продукты.

2. Наверняка наиболее интересный вариант применения WF связан с использованием Windows Server, а Longhorn появится уже скоро (на рубеже 2007–08 гг.).

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

4. В плане перспектив WF, наверное, стоит провести аналогию c SharePoint: встроенные технологии Windows SharePoint Services тоже появились в составе ОС относительно недавно и поначалу были встречены рынком с определенной осторожностью.

Закончив на этом вступление, посмотрим, что же представляет собой Windows Workflow Foundation. Но прежде отметим, что .NET Framework 3.0 доступен в составе не только Windows Vista, но и Windows XP.

Технологическая платформа .NET Framework 3.0

Платформа Microsoft .NET Framework 3.0 предназначена для разработки приложений нового поколения на основе управляемого кода для ОС семейства Windows Longhorn (в настоящее время они представлены клиентской Windows Vista). Она доступна также для работы в среде Windows XP и Windows Server 2003 в качестве дополнительного программного компонента.

По сути в .NET Framework 3.0 включен полный функционал ранее выпущенного набора .NET Framework 2.0, поверх которого устанавливается более высокоуровневый технологический слой, ранее известный под названием WinFX. Таким образом, объявленный сейчас набор .NET 3.0 состоит из двух частей, каждая из которых включает несколько компонентов. В состав первой части, .NET Framework 2.0, входят Common Language Runtime 2.0, Base Class Library 2.0, ADO.NET 2.0, ASP.NET 2.0, Windows Forms 2.0, VB 8.0 и C# 2.0. В состав WinFX — Windows Communication Foundation (WCF), Windows Presentation Foundation (WPF), Windows Workflow Foundation (WF) и Windows CardSpace (WCS).

Таким образом, .NET 3.0 — это .NET 2.0 плюс некоторая дополнительная функциональность. Существующая сегодня среда .NET 2.0 Framework и компиляторы остаются неизменными. Однако разработчики теперь получили новые возможности в четырех ключевых направлениях.

Windows Communication Foundation — по сути новое поколение средств взаимодействия программных компонентов: Web Services (asmx), Web Services Extensions (WSE), .NET Remoting, Enterprise Services и Microsoft Message Queue (MSMQ). Тут появилось очень много новшеств, но нужно подчеркнуть, что WCF не заменяет уже существующие технологии, а создает лишь расширения для них. Более того, первая версия WCF зачастую лишь предлагает новые способы применения старых средств.

Windows Presentation Foundation — первое реальное обновление технологической среды пользовательского интерфейса с момента выпуска Windows 95. В WPF входит новое ядро, которое должно заменить GDI и GDI+, используемые в нынешней Windows-платформе. WPF представляет собой высокоуровневый объектно-ориентированный функциональный слой (framework), позволяющий создавать 2D и 3D интерфейсы. Сейчас WPF можно назвать альтернативным вариантом DHTML и JavaScript, используемым в Web-разработке применительно к Windows Forms. Но в будущем WPF должен объединить Windows и Web-разработку (в том числе Ajax).

Windows Workflow Foundation часто характеризуют как функциональное подмножество BizTalk Orchestration, реализованное на уровне Windows (как это в свое время произошло с Terminal Services и SharePoint Services). Механизм управления потоками можно запускать в клиентских, серверных и Web-приложениях, при этом можно работать с визуальным конструктором для проектирования заданий и маршрутов выполнения работ. WF — это хороший способ познакомиться с преимуществами процессно-ориентированного подхода, особенно для тех, кому BizTalk Server кажется функционально избыточным, сложным в освоении или просто слишком дорогим.

Windows CardSpace представляет собой основанное на отраслевых стандартах решение для управления идентификацией при работе с Интернетом. Проще говоря, WCS — это способ простой и безопасной идентификации пользователей при перемещении между ресурсами Интернета, не требующий повторного ввода имен и паролей. В отличие от более ранних технологий унифицированной идентификации (например, Microsoft Passport) WCS управляет непосредственно пользователями и приложениями, с которыми устанавливается контакт (не из централизованного ресурса). Иными словами, можно использовать разные схемы (и уровни сложности) для идентификации при доступе, например, на Web-форумы и для банковских операций. В любом случае Microsoft не управляет доверительными удостоверениями пользователей.

Отметим, что в самом предварительном варианте (три года назад) WinFX состоял из трех основных компонентов — WCF, WPF и WinFS (новая файловая система). Но потом финальная реализация WinFS была отложена до появления серверной Longhorn, а в составе комплекса появились WF и InfoCard. Как поясняли еще год назад представители Microsoft, в этом расширении не было никаких неожиданностей — работы над данными технологиями велись уже давно, и их появление в Vistа было запланировано еще несколько лет назад. Например, WF ранее назывался Windows Workflow Services и имел статус служб ОС. А CardSpace (первоначально эта технология называлась InfoCard) сначала входила в состав WCF, но потом в результате роста актуальности проблем Identity Management выросла в отдельный компонент WinFX.

Общие принципы

Согласно определению Microsoft, Windows Workflow Foundation предоставляет собой программную модель, ядро выполнения и инструменты для быстрой разработки приложений, поддерживающих бизнес-процессы, в ОС Windows нового поколения. WF поддерживает как системные, так и пользовательские процессы, в том числе специальные приложения, потоки страниц интерфейса пользователя, документооборот, составные рабочие процессы для ориентированных на службы приложений, рабочий процесс на основе бизнес-правил и рабочий процесс для управления системами. В WF входят графические средства разработки, которые позволяют создавать приложения, поддерживающие бизнес-процессы, с использованием императивного кода и декларативных правил. При этом поддержка бизнес-процессов реализована на уровне базовой платформы разработки, благодаря чему можно создавать приложения, моделирующие постоянно изменяющиеся бизнес-процессы и легко адаптирующиеся к этим изменениям.

WF — это набор элементарных блоков, называемых "активностями" (activities), которые хранятся в виде моделей, описывающих реальные процессы. На основе моделей механизм workflow выполняет заданную последовательность активностей, реализуемых людьми или программными функциями.

Каждый запускаемый экземпляр workflow создается и управляется как внутренний процесс (in-process) механизма исполнения (workflow runtime engine, WRE). В пределах одного домена приложения может быть запущено несколько WRE, т. е. поддерживаются несколько параллельных экземпляров workflow.

После компиляции workflow-модели она может выполняться внутри любого процесса Windows, включая консольные приложения, оконные приложения, Windows-службы, Web-сервисы и Web-сайты ASP.NET. При этом каждый экземпляр workflow легко взаимодействует с хост-приложением (рис. 1).

Рис. 1. Функционирование экземпляров workflow, активностей и WRE в среде хост-приложения.

Пример: как это работает

Лучший способ понять, как работает WF, — создать простое консольное workflow-приложение. В примере мы будем вычислять факториал числа, вводимого пользователем. Для этого мы воспользуемся Visual Studio 2005, где выберем шаблон Sequential Workflow Console Application. После этого мы автоматически попадаем в workflow-конструктор (рис. 2), в котором можно работать с графическими схемами.

Для разработки программы мы будем также применять панель Toolbox, на которой выведен список доступных активностей (рис. 3). Их можно просто перетаскивать мышью в окно конструктора. Для начала мы перенесем таким образом блок While (рис. 4), который реализует повторяющийся цикл. Далее добавим внутрь блока While блок Code — именно тут будут читаться вводимые пользователем данные. После While таким же образом добавим конструкцию IfElse, и в нее тоже вставим блоки Code. Заметим, что красным восклицательным знаком будут выделены свойства, которые нужно задать перед запуском процесса.

Рис. 2. Workflow-конструктор.

Рис. 3. В Toolbox виден список доступных активностей.

Рис. 4. Вставляем блок While в процесс.

Сам процесс визуально представлен не только в workflow-конструкторе, но и в Solution Explorer. Оттуда можно попасть в окно кода, где нам нужно описать переменные:

Public class Workflow1
    Inherits SequentialWorkflowActivity
    Private num As Integer
    Private firstTime As Boolean = True

Вернемся обратно в конструктор. По красному знаку мы видим, что свойство Condition не установлено (рис. 5). Чтобы установить его, следует щелкнуть метку Property 'Condition' is not set. В окне свойств нужно раскрыть подсписок свойств (рис. 6) и ввести имя условия WhileLoopCondition — имя подпрограммы, которая будет задавать проекту условия в цикле. Можно выбрать и вариант декларативного описания условия — Declarative Rule Condition.

Код условия будет выглядеть так:

Private Sub WhileLoopCondition( _
  ByVal sender As System.Object, _
  ByVal e As System.Workflow.Activities.ConditionalEventArgs)
    If firstTime Then
      e.Result = True
      firstTime = False
    Else
      If num < 0 Then
        e.Result = True
      Else
        e.Result = False
      End If
    End If
End Sub

Рис. 5. Мы видим знак ошибки, так как условие перехода не установлено.

Рис. 6. Установка свойства Condition для блока While.

Для блока codeActivity1 мы установим свойство Name как ReadNumber, а ExecuteCode как readNum. Сам код будет таким:

Private Sub readNum( _
  ByVal sender As System.Object, _
  ByVal e As System.EventArgs)
  
  Console.WriteLine("Please enter a positive number")
  num = CInt(Console.ReadLine())
End Sub

Для ifElseBranchActivity1 установим свойство Condition как Zero и напишем код:

Private Sub Zero( _
  ByVal sender As System.Object, _
  ByVal e As System.Workflow.Activities.ConditionalEventArgs)
  If (num = 0) Then
    e.Result = True
  Else
    e.Result = False
  End If
End Sub

Для codeActivity2 зададим Name = ZeroFactorial, ExecuteCode = PrintResultForZero и введем код:

Private Sub PrintResultForZero( _
  ByVal sender As System.Object, _
  ByVal e As System.EventArgs)
    Console.WriteLine("0! is 1")
End Sub

Обратите внимание, что для правой ветви IfElse устанавливать свойство Condition не нужно — достаточно определить левое условие.

Для элемента codeActivity3 установим Name = NonZeroFactorial, ExecuteCode = PrintResult и вставим код:

Private Sub PrintResult( _
  ByVal sender As System.Object, _
  ByVal e As System.EventArgs)
  Dim fac As Integer = 1
  For i As Integer = 1 To num
    fac *= i
  Next
  Console.WriteLine(num & "! is " & fac)
End Sub

Теперь наш workflow выглядит так (рис. 7). Далее в Solution Explorer выберем Module1.vb, в котором сформируем главное консольное приложение (листинг 1). Обратите внимание — мы добавили строку Console.Readline в код, чтобы приложение не закрывалось немедленно после завершения.

Рис. 7. Законченное описание процесса выглядит так.

Итак, наше консольное приложение создает экземпляр процесса, используя класс WorkflowRuntime, а потом запускает его на выполнение. Здесь отслеживаются два события: WorkflowCompleted и WorkflowTerminated. По умолчанию процессы запускаются в асинхронном режиме механизмом Windows Workflow, поэтому хост-приложение не закроется до того, как закончится выполнение процессов. Для синхронизации потоков можно использовать например, объект AutoResetEvent.

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

Листинг 1. Код главного консольного приложения

Module Module1
  Class Program
    Shared WaitHandle As New AutoResetEvent(False)
    Shared Sub Main()
      Using workflowRuntime As New WorkflowRuntime()
      AddHandler workflowRuntime.WorkflowCompleted, _
        AddressOf OnWorkflowCompleted
      AddHandler workflowRuntime.WorkflowTerminated, _
        AddressOf OnWorkflowTerminated
      Dim workflowInstance As WorkflowInstance
        workflowInstance = _
          workflowRuntime.CreateWorkflow(GetType(Workflow1))
        workflowInstance.Start()
        WaitHandle.WaitOne()
        Console.ReadLine()
      End Using
    End Sub
    Shared Sub OnWorkflowCompleted( _
      ByVal sender As Object, _
      ByVal e As WorkflowCompletedEventArgs)
  
      WaitHandle.Set()
    End Sub
    Shared Sub OnWorkflowTerminated( _
      ByVal sender As Object, _
      ByVal e As WorkflowTerminatedEventArgs)
 
      Console.WriteLine(e.Exception.Message)
      WaitHandle.Set()
    End Sub
  End Class
End Module

Мнение разработчиков

Компания DocsVision (http://www.docsvision.ru) — разработчик одноименной системы управления документами и бизнес-процессами. Одна из особенностей фирмы и ее продукта — ставка на широкое использование технологий Microsoft, более того, акцент на использование их новшеств. В свое время компания одной из первых в стране стала применять .NET в своих продуктах; еще на этапе бета-тестирования Windows Vista она приступила к изучению инноваций ее программной модели Windows Workflow Foundation. WF имеет прямое предметное отношение к DocsVision, и ее разработчики намерены использовать этот механизм для расширения возможностей системы в управлении документами — он должен быть задействован в новой версии DocsVision, которая появится ближайшей осенью.

Мы попросили разработчиков DocsVision поделиться своим мнением о возможностях WF. Вот обобщенное изложение их коллективного мнения.

Несмотря на то, что в названии технологии присутствует термин workflow, WF реализует лишь небольшую часть компонентов концепции workflow-систем. По существу WF — это одна из библиотек .NET 3.0 (набор базовых классов), обеспечивающая создание процессно-ориентированных приложений на базе платформы .NET. В приложениях, написанных с использованием этих библиотек, можно будет реализовать некоторые функции процессных систем, а именно: возможность динамического получения информации о ходе приложения (журналирование); средства приостановки и запуска приложений (например, с целью модификации в процессе исполнения переменных окружения) и даже возможность изменения кода выполняемых программ после их остановки и перезапуска; встроенные интерфейсы для организации временного хранения данных окружения и т. п. Тут следует подчеркнуть, что Windows Workflow Foundation — это управление любыми процессами, необязательно деловыми, но и технологическими, и вообще любыми, которые можно описать алгоритмически.

В WF входят не только базовые функции управления процессом, но и интерфейс для визуального программирования процессов в Visual Studio. Помимо этого в состав новой версии Visual Studio** войдет готовый инструмент для визуальной разработки программ на базе WF. Он будет представлять собой диаграмму процесса, состоящего из готовых сборок для реализации стандартных компонентов процессного приложения. Однако WF (и именно так его позиционирует Microsoft) — это не законченная workflow-система, а набор технологических компонентов, на базе которых программисты третьих фирм смогут реализовать собственные системы управления бизнес-процессами (вот они-то уже будут собственно workflow-системами). Или же можно будет интегрировать функции WF в собственные прикладные решения. Например, Microsoft реализовала такую возможность в Office SharePoint Server 2007 и заявляет об использовании такого подхода в новой версии Microsoft BizTalk.


**Orcas, которая выйдет примерно одновременно с Windows Server Longhorn. — Прим. А.К.

Сама же библиотека WF не претендует на звание полнофункциональной системы управления бизнес-процессами, так как в ней отсутствует целый ряд необходимых инструментов, а именно:

  • серверы, которые собственно выполняют экземпляры отдельных процессов;
  • средства журналирования бизнес-процессов и база данных, накапливающая информацию о ходе бизнес-процессов;
  • средства визуального мониторинга исполнения бизнес-процессов;
  • клиентская инфраструктура Workflow: задания, очереди заданий, подсистемы нотификации исполнителей и т. п.;
  • средства построения отчетов о ходе исполнения процессов;
  • средства моделирования бизнес-процессов;
  • средства интеграции подсистемы управления бизнес-процессами и управления документами, а также многое другое…

В целом WF было бы правильно позиционировать как универсальный механизм, на который могут ориентироваться разработчики процессно-ориентированных приложений. Использование WF для решения собственных задач обеспечит этим разработчикам более высокую отдачу от базовой серверной и клиентской инфраструктуры Microsoft, а также даст возможность нарабатывать базу отдельных функциональных компонентов. В дальнейшем можно будет использовать библиотеки компонентов процессов — как свои, так и разработки третьих фирм — для реализации сложных бизнес-процессов, аналогично тому, как сейчас есть возможность повторного использования программных компонентов в «обычных» проектах заказной разработки.

Начиная с версии 4.0 система DocsVision будет базироваться на WF, что обеспечит нашим партнерам преимущества при реализации документно-ориентированных процессов, а также позволит приступить к созданию упомянутых выше библиотек.

В части управления процессами DocsVision, в дополнение к функциональным блокам и специализированному редактору для управления бизнес-процессами, содержит хранилище экземпляров процессов и движок, исполняющий каждый экземпляр процесса в реальном времени. Собственно говоря, ничего больше для платформы управления процессами и не нужно. Однако DocsVision — это система управления бизнес-процессами. Слово «бизнес» в данном случае означает, что в составе сущностей и функций системы есть бизнес-ориентированные сущности и функции: например, такие сущности бизнес-уровня, как документы, и такие функции, как «направить поручения пользователям» или «создать новый документ». Причем эти сущности и функции присутствуют и на самом верхнем уровне системы — при визуальном описании бизнес-процессов, их мониторинге и «ручном» управлении во время исполнения.

Базовые «алгоритмические» функции, конечно, были в DocsVision и раньше, но сейчас мы заменяем эти функции на Activities WF, переписывая их вызовы в остальных модулях DocsVision. В результате мы рассчитываем снизить затраты на поддержку и развитие этого базового слоя управления процессами, полагая, что теперь это будет делать Microsoft, а мы сможем сосредоточиться именно на бизнес-уровне, развивая и поддерживая его.

Мы также рассчитываем использовать шлюзовые возможности, связанные с наличием в .NET Framework других надстроек, таких, как Communication Foundation, и их интеграцию с Workflow Foundation. Сейчас мы сами поддерживаем и развиваем шлюз DocsVision с Exchange, необходимый, например, для рассылки извещений, документов, поручений и обработки различных событий с этими объектами. Мы надеемся, что и эта — в большей степени технологическая, нежели прикладная — задача будет решаться Microsoft.

Вообще говоря, WF представляется нам удобным «стандартом» для разработки шлюзов к Workflow от любого приложения. Во всяком случае, это стимулирует вендоров к созданию таких шлюзов. Таким образом может появиться, например, шлюз к IBM Lotus Domino, "1С", Microsoft Dynamics (последние два войдут в состав DocsVision 4.0) и т. п. Любой такой шлюз будет создаваться и поддерживаться не нами, а разработчиком приложения. Однако мы сможем этот шлюз использовать, и его наличие будет расширять рынок и для нашей системы тоже.

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

В DocsVision есть свои приложения — это сервер управления документами, приложение «Делопроизводство» и ряд других. Если WF станет действительно стандартом де-факто для создания систем управления процессами, мы можем перенести шлюзы наших приложений на уровень WF для того, чтобы их использовали наши ISV-партнеры.

Как будет развиваться ситуация, во многом зависит и от Microsoft. Если в ближайшее время появятся средства интеграции WF c Microsoft SharePoint Services, Microsoft Dynamics и другими системами прикладного уровня от Microsoft и других производителей, а также набор Activities для реализации различных прикладных задач, это может создать «критическую массу», необходимую для широкого использования WF сообществом разработчиков ПО.