Поделиться через


Использование действия «Interop» в рабочем процессе платформы .NET Framework 4

Данный раздел относится к версии Windows Workflow Foundation 4.

Действия, созданные в Платформа .NET Framework 3.0 или в .NET Framework 3.5, могут использоваться в рабочем процессе .NET Framework 4 посредством использования действия Interop. В этом разделе приведены общие сведения об использовании действия Interop.

Ee264174.note(ru-ru,VS.100).gif Примечание o Visual Basic.
Действие Interop появляется в области элементов конструктора рабочих процессов, только если параметру Целевая платформа в проекте рабочего процесса задано значение .Net Framework 4.

Использование действия Interop в рабочих процессах платформы .NET Framework 4

В данном разделе создается библиотека действий .NET Framework 3.5, содержащая действие DiscountCalculator. Действие DiscountCalculator вычисляет скидку на основе стоимости приобретений и состоит из действия SequenceActivity, содержащего действие PolicyActivity.

Ee264174.note(ru-ru,VS.100).gifПримечание
Действие .NET Framework 3.5, создаваемое в этом разделе, использует действие PolicyActivity для реализации логики действия. Для использования правил в рабочем процессе .NET Framework 4 не обязательно использовать пользовательское действие .NET Framework 3.5 или действие Interop. Пример использования правил в рабочем процессе .NET Framework 4 без использования действия Interop, см. в образце Действие политики в .NET Framework 4.

Создание проекта библиотеки действий платформы .NET Framework 3.5

  1. Откройте Visual Studio 2010 и в меню Файл выберите пункт Создать, затем выберите Проект...

  2. Разверните узел Другие типы проектов в области Установленные шаблоны и выберите Решения Visual Studio.

  3. В списке Решения Visual Studio выберите Пустое решение. В поле Имя введите PolicyInteropDemo и нажмите кнопку ОК.

  4. Щелкните правой кнопкой мыши имя проекта PolicyInteropDemo в Обозревателе решений, выберите пункт Добавить, затем выберите Создать проект...

    Ee264174.Tip(ru-ru,VS.100).gifСовет.
    Если окно Обозреватель решений не отображается, в меню Вид выберите пункт Обозреватель решений.

  5. В списке Установленные шаблоны выберите Visual C#, затем выберите Рабочий процесс. В раскрывающемся списке версий .NET Framework выберите .NET Framework 3.5, затем выберите в списке Шаблоны пункт Библиотека действий рабочих процессов.

  6. В поле Имя введите PolicyActivityLibrary и нажмите кнопку ОК.

  7. Щелкните правой кнопкой мыши действие Activity1.cs в Обозревателе решений и выберите пункт Удалить. Нажмите кнопку ОК для подтверждения.

Создание действия DiscountCalculator

  1. В Обозревателе решений щелкните правой кнопкой мыши проект PolicyActivityLibrary и выберите пункт Добавить, затем выберите Действие...

  2. Выберите шаблон Действие (с разделением кода) из списка Элементы Visual C#. В поле Имя введите DiscountCalculator и нажмите кнопку ОК.

  3. Щелкните правой кнопкой мыши файл DiscountCalculator.xoml в Обозревателе решений и выберите Просмотр кода.

  4. Добавьте в класс DiscountCalculator приведенные ниже три свойства.

    public partial class DiscountCalculator : SequenceActivity
    {
        public double Subtotal { get; set; }
        public double DiscountPercent { get; set; }
        public double Total { get; set; }
    }
    
  5. Щелкните правой кнопкой мыши файл DiscountCalculator.xoml в Обозревателе решений и выберите Конструктор представлений.

  6. Перетащите действие Policy из раздела Windows Workflow v3.0 панели инструментов на действие DiscountCalculator.

    Ee264174.Tip(ru-ru,VS.100).gifСовет.
    Если окно Область элементов не отображается, в меню Вид выберите Область элементов.

Настройка правил

  1. Щелкните недавно созданное действие Policy, чтобы его выбрать, если оно еще не выбрано.

  2. Щелкните свойство RuleSetReference в окне Свойства, чтобы выбрать его, затем нажмите кнопку с многоточием справа от свойства.

    Ee264174.Tip(ru-ru,VS.100).gifСовет.
    Если окно Свойства не отображается, выберите пункт Окно «Свойства» в меню Вид.

  3. Нажмите Создать...

  4. Нажмите кнопку Добавить правило.

  5. В поле Условие введите указанное далее выражение.

    this.Subtotal >= 50 && this.Subtotal < 100
    
  6. В поле Действия THEN: введите указанное далее выражение.

    this.DiscountPercent = 0.075
    
  7. Нажмите кнопку Добавить правило.

  8. В поле Условие введите указанное далее выражение.

    this.Subtotal >= 100
    
  9. В поле Действия THEN: введите указанное далее выражение.

    this.DiscountPercent = 0.15
    
  10. Нажмите кнопку Добавить правило.

  11. В поле Условие введите указанное далее выражение.

    this.DiscountPercent > 0
    
  12. В поле Действия THEN: введите указанное далее выражение.

    this.Total = this.Subtotal - this.Subtotal * this.DiscountPercent
    
  13. Введите в текстовое поле Действия Else: приведенное ниже выражение.

    this.Total = this.Subtotal
    
  14. Чтобы закрыть диалоговое окно Редактор набора правил, нажмите кнопку ОК.

  15. Выберите в списке Имя только что созданный набор правил RuleSet и нажмите кнопку ОК.

  16. Нажать клавишу 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. Для обоих рабочих процессов используется одно ведущее приложение.

Создание ведущего приложения

  1. Щелкните правой кнопкой мыши имя проекта PolicyInteropDemo в окне Обозреватель решений, выберите пункт Добавить, затем выберите пункт Создать проект...

  2. В раскрывающемся списке версий .NET Framework выберите .NET Framework 4, затем выберите в списке Элементы Visual C# пункт Консольное приложение рабочего процесса.

  3. В поле Имя введите PolicyInteropHost и нажмите кнопку ОК.

  4. В Обозревателе решений щелкните правой кнопкой мыши проект PolicyInteropHost и выберите пункт Свойства.

  5. В раскрывающемся списке Требуемая версия .NET Framework измените выбранный вариант с .NET Framework 4 (клиентский профиль) на .NET Framework 4. Нажмите кнопку Да для подтверждения.

  6. В обозревателе решений щелкните правой кнопкой мыши PolicyInteropHost и выберите команду Добавить ссылку….

  7. Перейдите на вкладку Проекты и выберите PolicyActivityLibrary, после чего нажмите кнопку ОК.

  8. В обозревателе решений щелкните правой кнопкой мыши PolicyInteropHost и выберите команду Добавить ссылку….

  9. На вкладке .NET выберите System.Workflow.Activities, System.Workflow.ComponentModel и System.Workflow.Runtime, затем нажмите кнопку ОК.

  10. В Обозревателе решений щелкните правой кнопкой мыши проект PolicyInteropHost и нажмите Назначить запускаемым проектом.

  11. Нажать клавишу F6 для построения решения.

Использование действия Interop в коде

В данном примере определение рабочего процесса создается с использованием кода, содержащего действия Interop и DiscountCalculator. Этот рабочий процесс вызывается с помощью WorkflowInvoker, а результаты оценки правила записываются в консоль с использованием действия WriteLine.

Использование действия Interop в коде

  1. В обозревателе решений щелкните правой кнопкой мыши файл Program.cs и выберите команду Просмотр кода.

  2. Добавьте следующую инструкциюusing в начало файла.

    using PolicyActivityLibrary;
    
  3. Удалите содержимое метода Main и замените его следующим кодом.

    static void Main(string[] args)
    {
        CalculateDiscountUsingCodeWorkflow();
    }
    
  4. Создайте новый метод в классе 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);
    }
    
    Ee264174.note(ru-ru,VS.100).gifПримечание
    Свойства Subtotal, DiscountPercent и Total действия DiscountCalculator отображаются как аргументы действия Interop, привязанные к переменным локального рабочего процесса в коллекции ActivityProperties действия Interop. Subtotal добавляется как аргумент In, поскольку данные Subtotal направляются действию Interop, а DiscountPercent и Total передаются как аргументы Out, поскольку их данные получаются из действия Interop. Следует заметить, что аргументы Out добавляются с именами DiscountPercentOut и TotalOut чтобы показать, что они представляют аргументы с направлением Out. Тип DiscountCalculator указан как тип ActivityType действия Interop.

  5. Нажмите сочетание клавиш CTRL+F5 для создания и запуска приложения. Подставляя различные значения в качестве значения Subtotal, можно проверить различные уровни скидок, реализуемые действием DiscountCalculator.

    Variable<double> Subtotal = new Variable<double>
    {
        Default = 75.99, // Change this value.
        Name = "Subtotal"
    };
    

Использование действия Interop в конструкторе рабочих процессов

В данном примере рабочий процесс создается с использованием конструктора рабочих процессов. Рабочий процесс выполняет те же функции, что и предыдущий пример, за одним исключением: вместо использования действия WriteLine для отображения скидки ведущее приложение получает и отображает сведения о скидке при завершении рабочего процесса. Также локальные переменные рабочего процесса не используются для хранения данных. Вместо этого аргументы создаются в конструкторе рабочих процессов, а значения передаются из ведущего приложения при вызове рабочего процесса.

Размещение PolicyActivity с использованием рабочего процесса, созданного в конструкторе рабочих процессов

  1. Щелкните правой кнопкой мыши Workflow1.xaml в окне Обозреватель решений и выберите пункт Удалить. Нажмите кнопку ОК для подтверждения.

  2. Щелкните правой кнопкой мыши PolicyInteropHost в Обозревателе решений и выберите пункт Добавить, Новый элемент….

  3. Разверните узел Элементы Visual C# и выберите Рабочий процесс. Выберите Действие в списке Элементы Visual C#.

  4. В поле Имя введите DiscountWorkflow и нажмите кнопку Добавить.

  5. Нажмите кнопку Аргументы в нижнем левом углу конструктора рабочих процессов, чтобы отобразить область Аргументы.

  6. Нажмите кнопку Создать аргумент.

  7. В поле Имя введите Subtotal, выберите в раскрывающемся поле Направление Вход, выберите Double в раскрывающемся поле Тип аргумента, а затем нажмите клавишу ВВОД, чтобы сохранить аргумент.

    Ee264174.note(ru-ru,VS.100).gifПримечание
    Если в раскрывающемся списке Тип аргумента отсутствует значение Double, то щелкните Поиск типов…, введите System.Double в поле Имя типа и нажмите кнопку ОК.

  8. Нажмите кнопку Создать аргумент.

  9. В поле Имя введите DiscountPercent, выберите в раскрывающемся поле Направление значение Выход, выберите Double в раскрывающемся поле Тип аргумента, а затем нажмите клавишу ВВОД, чтобы сохранить аргумент.

  10. Нажмите кнопку Создать аргумент.

  11. В поле Имя введите Total, выберите в раскрывающемся поле Направление значение Выход, выберите Double в раскрывающемся поле Тип аргумента, а затем нажмите клавишу ВВОД, чтобы сохранить аргумент.

  12. Нажмите кнопку Аргументы в нижнем левом углу конструктора рабочих процессов, чтобы закрыть область Аргументы.

  13. Перетащите действие Sequence из раздела Поток управления Области элементов в области конструктора рабочих процессов.

  14. Перетащите действие Interop из раздела Миграция Области элементов в действие Sequence.

  15. Щелкните действие Interop по метке Щелкните для просмотра…, введите DiscountCalculator в поле Имя типа, затем нажмите кнопку ОК.

    Ee264174.note(ru-ru,VS.100).gifПримечание
    Если действие Interop добавляется в рабочий процесс, а тип DiscountCalculator указан в качестве типа ActivityType, то действие Interop предоставит три аргумента In и три аргумента Out, представляющие три открытых свойства действия DiscountCalculator. Аргументы In имеют то же имя, что и три открытых свойства, а три аргумента Out имеют те же имена, но с добавлением к имени свойства слова Out. В ходе последующих шагов аргументы рабочего процесса, созданные ранее, привязываются к аргументам действия Interop.

  16. Введите DiscountPercent в поле Введите выражение VB справа от свойства DiscountPercentOut и нажмите кнопку TAB.

  17. Введите Subtotal в поле Введите выражение VB справа от свойства Subtotal и нажмите кнопку TAB.

  18. Введите Total в поле Введите выражение VB справа от свойства TotalOut и нажмите кнопку TAB.

  19. В обозревателе решений щелкните правой кнопкой мыши файл Program.cs и выберите команду Просмотр кода.

  20. Добавьте следующую инструкциюusing в начало файла.

    using System.Collections.Generic;
    
  21. Закомментируйте вызов метода CalculateDiscountInCode в методе Main и добавьте следующий код.

    Ee264174.note(ru-ru,VS.100).gifПримечание
    Если предыдущая процедура не была выполнена и код Main по умолчанию все еще присутствует, замените содержимое метода Main следующим кодом.

    static void Main(string[] args)
    {
        CalculateDiscountUsingDesignerWorkflow();
        //CalculateDiscountUsingCodeWorkflow();
    }
    
  22. Создайте новый метод в классе 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"]);
    }
    
  23. Нажмите сочетание клавиш CTRL+F5 для создания и запуска приложения. Чтобы задать другую сумму Subtotal, измените значение SubtotalValue в следующем коде.

    double SubtotalValue = 125.99; // Change this value.
    

Общие сведения об особенностях правил

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

Возможность правил Документация

Общие сведения о правилах

Вводные сведения для обработчика правил Windows Workflow Foundation

Набор правил

Использование наборов правил в рабочих процессах и RuleSet

Оценка правил

Оценка правил в наборах правил

Цепочки правил

Управление прямыми логическими цепочками и Прямые логические цепочки правил

Обработка коллекций в правилах

Обработка коллекций в правилах

Использование действия PolicyActivity

Использование действия PolicyActivity и PolicyActivity

Рабочие процессы, созданные в .NET Framework 4, используют не все предоставляемые в WF возможности правил, например они не реализуют декларативные условия действий и условные действия, такие как ConditionedActivityGroup и ReplicatorActivity. При необходимости можно воспользоваться этими функциональными возможностями в рабочих процессах, созданных с помощью Платформа .NET Framework 3.0 и .NET Framework 3.5. Дополнительные сведения см. в разделе Миграция рабочих процессов.