Использование действия «Interop» в рабочем процессе платформы .NET Framework 4
Данный раздел относится к версии Windows Workflow Foundation 4.
Действия, созданные в Платформа .NET Framework 3.0 или в .NET Framework 3.5, могут использоваться в рабочем процессе .NET Framework 4 посредством использования действия Interop. В этом разделе приведены общие сведения об использовании действия Interop.
![]() |
---|
Действие Interop появляется в области элементов конструктора рабочих процессов, только если параметру Целевая платформа в проекте рабочего процесса задано значение .Net Framework 4. |
Использование действия Interop в рабочих процессах платформы .NET Framework 4
В данном разделе создается библиотека действий .NET Framework 3.5, содержащая действие DiscountCalculator
. Действие DiscountCalculator
вычисляет скидку на основе стоимости приобретений и состоит из действия SequenceActivity, содержащего действие PolicyActivity.
![]() |
---|
Действие .NET Framework 3.5, создаваемое в этом разделе, использует действие PolicyActivity для реализации логики действия. Для использования правил в рабочем процессе .NET Framework 4 не обязательно использовать пользовательское действие .NET Framework 3.5 или действие Interop. Пример использования правил в рабочем процессе .NET Framework 4 без использования действия Interop, см. в образце Действие политики в .NET Framework 4. |
Создание проекта библиотеки действий платформы .NET Framework 3.5
Откройте Visual Studio 2010 и в меню Файл выберите пункт Создать, затем выберите Проект...
Разверните узел Другие типы проектов в области Установленные шаблоны и выберите Решения Visual Studio.
В списке Решения Visual Studio выберите Пустое решение. В поле Имя введите PolicyInteropDemo и нажмите кнопку ОК.
Щелкните правой кнопкой мыши имя проекта PolicyInteropDemo в Обозревателе решений, выберите пункт Добавить, затем выберите Создать проект...
Совет.
Если окно Обозреватель решений не отображается, в меню Вид выберите пункт Обозреватель решений. В списке Установленные шаблоны выберите Visual C#, затем выберите Рабочий процесс. В раскрывающемся списке версий .NET Framework выберите .NET Framework 3.5, затем выберите в списке Шаблоны пункт Библиотека действий рабочих процессов.
В поле Имя введите PolicyActivityLibrary и нажмите кнопку ОК.
Щелкните правой кнопкой мыши действие Activity1.cs в Обозревателе решений и выберите пункт Удалить. Нажмите кнопку ОК для подтверждения.
Создание действия DiscountCalculator
В Обозревателе решений щелкните правой кнопкой мыши проект PolicyActivityLibrary и выберите пункт Добавить, затем выберите Действие...
Выберите шаблон Действие (с разделением кода) из списка Элементы Visual C#. В поле Имя введите DiscountCalculator и нажмите кнопку ОК.
Щелкните правой кнопкой мыши файл DiscountCalculator.xoml в Обозревателе решений и выберите Просмотр кода.
Добавьте в класс
DiscountCalculator
приведенные ниже три свойства.public partial class DiscountCalculator : SequenceActivity { public double Subtotal { get; set; } public double DiscountPercent { get; set; } public double Total { get; set; } }
Щелкните правой кнопкой мыши файл DiscountCalculator.xoml в Обозревателе решений и выберите Конструктор представлений.
Перетащите действие Policy из раздела Windows Workflow v3.0 панели инструментов на действие DiscountCalculator.
Совет.
Если окно Область элементов не отображается, в меню Вид выберите Область элементов.
Настройка правил
Щелкните недавно созданное действие Policy, чтобы его выбрать, если оно еще не выбрано.
Щелкните свойство RuleSetReference в окне Свойства, чтобы выбрать его, затем нажмите кнопку с многоточием справа от свойства.
Совет.
Если окно Свойства не отображается, выберите пункт Окно «Свойства» в меню Вид. Нажмите Создать...
Нажмите кнопку Добавить правило.
В поле Условие введите указанное далее выражение.
this.Subtotal >= 50 && this.Subtotal < 100
В поле Действия THEN: введите указанное далее выражение.
this.DiscountPercent = 0.075
Нажмите кнопку Добавить правило.
В поле Условие введите указанное далее выражение.
this.Subtotal >= 100
В поле Действия THEN: введите указанное далее выражение.
this.DiscountPercent = 0.15
Нажмите кнопку Добавить правило.
В поле Условие введите указанное далее выражение.
this.DiscountPercent > 0
В поле Действия THEN: введите указанное далее выражение.
this.Total = this.Subtotal - this.Subtotal * this.DiscountPercent
Введите в текстовое поле Действия Else: приведенное ниже выражение.
this.Total = this.Subtotal
Чтобы закрыть диалоговое окно Редактор набора правил, нажмите кнопку ОК.
Выберите в списке Имя только что созданный набор правил RuleSet и нажмите кнопку ОК.
Нажать клавишу F6 для построения решения.
Правила, добавленные в действие DiscountCalculator
в ходе выполнения этой процедуры, показаны в следующем примере кода.
Rule1: IF this.Subtotal >= 50 && this.Subtotal < 100
THEN this.DiscountPercent = 0.075
Rule2: IF this. Subtotal >= 100
THEN this.DiscountPercent = 0.15
Rule3: IF this.DiscountPercent > 0
THEN this.Total = this.Subtotal - this.Subtotal * this.DiscountPercent
ELSE this.Total = this.Subtotal
При выполнении действия PolicyActivity выполняется оценка этих трех правил, которые соответственно изменяют значения свойств Subtotal
, DiscountPercent
и Total
для действия DiscountCalculator
с целью вычисления требуемой скидки.
Использование действия DiscountCalculator совместно с действием Interop
Чтобы использовать действие DiscountCalculator
в рабочем процессе .NET Framework 4, используется действие Interop. В данном разделе создаются два рабочих процесса (один с использованием кода и один с помощью конструктора рабочего процесса), которые демонстрируют использование действия Interop совместно с действием DiscountCalculator
. Для обоих рабочих процессов используется одно ведущее приложение.
Создание ведущего приложения
Щелкните правой кнопкой мыши имя проекта PolicyInteropDemo в окне Обозреватель решений, выберите пункт Добавить, затем выберите пункт Создать проект...
В раскрывающемся списке версий .NET Framework выберите .NET Framework 4, затем выберите в списке Элементы Visual C# пункт Консольное приложение рабочего процесса.
В поле Имя введите PolicyInteropHost и нажмите кнопку ОК.
В Обозревателе решений щелкните правой кнопкой мыши проект PolicyInteropHost и выберите пункт Свойства.
В раскрывающемся списке Требуемая версия .NET Framework измените выбранный вариант с .NET Framework 4 (клиентский профиль) на .NET Framework 4. Нажмите кнопку Да для подтверждения.
В обозревателе решений щелкните правой кнопкой мыши PolicyInteropHost и выберите команду Добавить ссылку….
Перейдите на вкладку Проекты и выберите PolicyActivityLibrary, после чего нажмите кнопку ОК.
В обозревателе решений щелкните правой кнопкой мыши PolicyInteropHost и выберите команду Добавить ссылку….
На вкладке .NET выберите System.Workflow.Activities, System.Workflow.ComponentModel и System.Workflow.Runtime, затем нажмите кнопку ОК.
В Обозревателе решений щелкните правой кнопкой мыши проект PolicyInteropHost и нажмите Назначить запускаемым проектом.
Нажать клавишу F6 для построения решения.
Использование действия Interop в коде
В данном примере определение рабочего процесса создается с использованием кода, содержащего действия Interop и DiscountCalculator
. Этот рабочий процесс вызывается с помощью WorkflowInvoker, а результаты оценки правила записываются в консоль с использованием действия WriteLine.
Использование действия Interop в коде
В обозревателе решений щелкните правой кнопкой мыши файл Program.cs и выберите команду Просмотр кода.
Добавьте следующую инструкцию
using
в начало файла.using PolicyActivityLibrary;
Удалите содержимое метода
Main
и замените его следующим кодом.static void Main(string[] args) { CalculateDiscountUsingCodeWorkflow(); }
Создайте новый метод в классе
Program
с именемCalculateDiscountUsingCodeWorkflow
, который содержит следующий код.static void CalculateDiscountUsingCodeWorkflow() { Variable<double> Subtotal = new Variable<double> { Default = 75.99, Name = "Subtotal" }; Variable<double> DiscountPercent = new Variable<double> { Name = "DiscountPercent" }; Variable<double> Total = new Variable<double> { Name = "Total" }; Activity wf = new Sequence { Variables = { Subtotal, DiscountPercent, Total }, Activities = { new Interop { ActivityType = typeof(DiscountCalculator), ActivityProperties = { { "Subtotal", new InArgument<double>(Subtotal) }, { "DiscountPercentOut", new OutArgument<double>(DiscountPercent) }, { "TotalOut", new OutArgument<double>(Total) } } }, new WriteLine { Text = new InArgument<string>(env => string.Format("Subtotal: {0:C}, Discount {1}%, Total {2:C}", Subtotal.Get(env), DiscountPercent.Get(env) * 100, Total.Get(env))) } } }; WorkflowInvoker.Invoke(wf); }
Примечание
Свойства Subtotal
,DiscountPercent
иTotal
действияDiscountCalculator
отображаются как аргументы действия Interop, привязанные к переменным локального рабочего процесса в коллекции ActivityProperties действия Interop.Subtotal
добавляется как аргумент In, поскольку данныеSubtotal
направляются действию Interop, аDiscountPercent
иTotal
передаются как аргументы Out, поскольку их данные получаются из действия Interop. Следует заметить, что аргументы Out добавляются с именамиDiscountPercentOut
иTotalOut
чтобы показать, что они представляют аргументы с направлением Out. ТипDiscountCalculator
указан как тип ActivityType действия Interop.Нажмите сочетание клавиш CTRL+F5 для создания и запуска приложения. Подставляя различные значения в качестве значения
Subtotal
, можно проверить различные уровни скидок, реализуемые действиемDiscountCalculator
.Variable<double> Subtotal = new Variable<double> { Default = 75.99, // Change this value. Name = "Subtotal" };
Использование действия Interop в конструкторе рабочих процессов
В данном примере рабочий процесс создается с использованием конструктора рабочих процессов. Рабочий процесс выполняет те же функции, что и предыдущий пример, за одним исключением: вместо использования действия WriteLine для отображения скидки ведущее приложение получает и отображает сведения о скидке при завершении рабочего процесса. Также локальные переменные рабочего процесса не используются для хранения данных. Вместо этого аргументы создаются в конструкторе рабочих процессов, а значения передаются из ведущего приложения при вызове рабочего процесса.
Размещение PolicyActivity с использованием рабочего процесса, созданного в конструкторе рабочих процессов
Щелкните правой кнопкой мыши Workflow1.xaml в окне Обозреватель решений и выберите пункт Удалить. Нажмите кнопку ОК для подтверждения.
Щелкните правой кнопкой мыши PolicyInteropHost в Обозревателе решений и выберите пункт Добавить, Новый элемент….
Разверните узел Элементы Visual C# и выберите Рабочий процесс. Выберите Действие в списке Элементы Visual C#.
В поле Имя введите DiscountWorkflow и нажмите кнопку Добавить.
Нажмите кнопку Аргументы в нижнем левом углу конструктора рабочих процессов, чтобы отобразить область Аргументы.
Нажмите кнопку Создать аргумент.
В поле Имя введите Subtotal, выберите в раскрывающемся поле Направление Вход, выберите Double в раскрывающемся поле Тип аргумента, а затем нажмите клавишу ВВОД, чтобы сохранить аргумент.
Примечание
Если в раскрывающемся списке Тип аргумента отсутствует значение Double, то щелкните Поиск типов…, введите System.Double в поле Имя типа и нажмите кнопку ОК. Нажмите кнопку Создать аргумент.
В поле Имя введите DiscountPercent, выберите в раскрывающемся поле Направление значение Выход, выберите Double в раскрывающемся поле Тип аргумента, а затем нажмите клавишу ВВОД, чтобы сохранить аргумент.
Нажмите кнопку Создать аргумент.
В поле Имя введите Total, выберите в раскрывающемся поле Направление значение Выход, выберите Double в раскрывающемся поле Тип аргумента, а затем нажмите клавишу ВВОД, чтобы сохранить аргумент.
Нажмите кнопку Аргументы в нижнем левом углу конструктора рабочих процессов, чтобы закрыть область Аргументы.
Перетащите действие Sequence из раздела Поток управления Области элементов в области конструктора рабочих процессов.
Перетащите действие Interop из раздела Миграция Области элементов в действие Sequence.
Щелкните действие Interop по метке Щелкните для просмотра…, введите DiscountCalculator в поле Имя типа, затем нажмите кнопку ОК.
Примечание
Если действие Interop добавляется в рабочий процесс, а тип DiscountCalculator
указан в качестве типа ActivityType, то действие Interop предоставит три аргумента In и три аргумента Out, представляющие три открытых свойства действияDiscountCalculator
. Аргументы In имеют то же имя, что и три открытых свойства, а три аргумента Out имеют те же имена, но с добавлением к имени свойства слова Out. В ходе последующих шагов аргументы рабочего процесса, созданные ранее, привязываются к аргументам действия Interop.Введите DiscountPercent в поле Введите выражение VB справа от свойства DiscountPercentOut и нажмите кнопку TAB.
Введите Subtotal в поле Введите выражение VB справа от свойства Subtotal и нажмите кнопку TAB.
Введите Total в поле Введите выражение VB справа от свойства TotalOut и нажмите кнопку TAB.
В обозревателе решений щелкните правой кнопкой мыши файл Program.cs и выберите команду Просмотр кода.
Добавьте следующую инструкцию
using
в начало файла.using System.Collections.Generic;
Закомментируйте вызов метода
CalculateDiscountInCode
в методеMain
и добавьте следующий код.Примечание
Если предыдущая процедура не была выполнена и код Main
по умолчанию все еще присутствует, замените содержимое методаMain
следующим кодом.static void Main(string[] args) { CalculateDiscountUsingDesignerWorkflow(); //CalculateDiscountUsingCodeWorkflow(); }
Создайте новый метод в классе
Program
с именемCalculateDiscountUsingDesignerWorkflow
, который содержит следующий код.static void CalculateDiscountUsingDesignerWorkflow() { double SubtotalValue = 125.99; Dictionary<string, object> wfargs = new Dictionary<string, object> { {"Subtotal", SubtotalValue} }; Activity wf = new DiscountWorkflow(); IDictionary<string, object> outputs = WorkflowInvoker.Invoke(wf, wfargs); Console.WriteLine("Subtotal: {0:C}, Discount {1}%, Total {2:C}", SubtotalValue, (double)outputs["DiscountPercent"] * 100, outputs["Total"]); }
Нажмите сочетание клавиш CTRL+F5 для создания и запуска приложения. Чтобы задать другую сумму
Subtotal
, измените значениеSubtotalValue
в следующем коде.double SubtotalValue = 125.99; // Change this value.
Общие сведения об особенностях правил
Обработчик правил WF обеспечивает поддержку обработки правил с учетом приоритетов и поддержкой прямых логических цепочек. Оценка правил может проводиться для одного элемента или для элементов коллекции. Общие сведения о правилах, а также сведения о функциональных возможностях отдельных правил см. в следующей таблице.
Возможность правил | Документация |
---|---|
Общие сведения о правилах |
Вводные сведения для обработчика правил Windows Workflow Foundation |
Набор правил |
|
Оценка правил |
|
Цепочки правил |
Управление прямыми логическими цепочками и Прямые логические цепочки правил |
Обработка коллекций в правилах |
|
Использование действия PolicyActivity |
Использование действия PolicyActivity и PolicyActivity |
Рабочие процессы, созданные в .NET Framework 4, используют не все предоставляемые в WF возможности правил, например они не реализуют декларативные условия действий и условные действия, такие как ConditionedActivityGroup и ReplicatorActivity. При необходимости можно воспользоваться этими функциональными возможностями в рабочих процессах, созданных с помощью Платформа .NET Framework 3.0 и .NET Framework 3.5. Дополнительные сведения см. в разделе Миграция рабочих процессов.