Действие InvokeWorkflow внутри действия репликатора - PullRequest
0 голосов
/ 13 ноября 2008

У меня есть действие invokeworkflow внутри действия репликатора. Рабочий процесс, который я пытаюсь вызвать, требует, чтобы ему были переданы 2 параметра, целое число и строковые параметры, и они должны быть переданы в рабочий процесс репликатором. Любые идеи о том, как это можно сделать?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 13 ноября 2008

Вот полный пример (обратите внимание, что все, что включено в конструкторы, может быть установлено на панели свойств конструктора): Workflow3 - это целевой рабочий процесс, который содержит только CodeActivity, а следующий код:

public sealed partial class Workflow3 : SequentialWorkflowActivity
{
    public static readonly DependencyProperty MyIntProperty =
        DependencyProperty.Register("MyInt", typeof(int), typeof(Workflow3));
    public static readonly DependencyProperty MyStringProperty =
        DependencyProperty.Register("MyString", typeof(string), typeof(Workflow3));

    public Workflow3()
    {
        InitializeComponent();

        this.codeActivity1.ExecuteCode += new System.EventHandler(this.codeActivity1_ExecuteCode);
    }

    public int MyInt
    {
        get { return (int)GetValue(MyIntProperty); }
        set { SetValue(MyIntProperty, value); }
    }

    public string MyString
    {
        get { return (string)GetValue(MyStringProperty); }
        set { SetValue(MyStringProperty, value); }
    }

    private void codeActivity1_ExecuteCode(object sender, EventArgs e)
    {
        Console.WriteLine("Invoke WF: Int = {0}, String = {1}", this.MyInt, this.MyString);
    }
}

Workflow2 - рабочий процесс хостинга, который содержит только ReplicatorActivity. ReplicatorActivity содержит только InvokeWorkflowActivity, для которого для TargetWorkflow установлено значение Workflow3. Код-это следующий:

public sealed partial class Workflow2 : SequentialWorkflowActivity
{
    // Variables used in bindings
    public int InvokeWorkflowActivity1_MyInt = default(int);
    public string InvokeWorkflowActivity1_MyString = string.Empty;

    public Workflow2()
    {
        InitializeComponent();

        // Bind MyInt parameter of target workflow to my InvokeWorkflowActivity1_MyInt
        WorkflowParameterBinding wpb1 = new WorkflowParameterBinding("MyInt");
        wpb1.SetBinding(WorkflowParameterBinding.ValueProperty, new ActivityBind(this.GetType().Name, "InvokeWorkflowActivity1_MyInt"));
        this.invokeWorkflowActivity1.ParameterBindings.Add(wpb1);

        // Bind MyString parameter of target workflow to my InvokeWorkflowActivity1_MyString
        WorkflowParameterBinding wpb2 = new WorkflowParameterBinding("MyString");
        wpb2.SetBinding(WorkflowParameterBinding.ValueProperty, new ActivityBind(this.GetType().Name, "InvokeWorkflowActivity1_MyString"));
        this.invokeWorkflowActivity1.ParameterBindings.Add(wpb2);

        // Add event handler for Replicator's Initialized event
        this.replicatorActivity1.Initialized += new EventHandler(ReplicatorInitialized);

        // Add event handler for Replicator's ChildInitialized event
        this.replicatorActivity1.ChildInitialized += new EventHandler<ReplicatorChildEventArgs>(this.ChildInitialized);
    }

    private void ReplicatorInitialized(object sender, EventArgs e)
    {
        // Find how many workflows I want
        List<MyClass> list = new List<MyClass>();
        list.Add(new MyClass() { MyInt = 1, MyString = "Str1" });
        list.Add(new MyClass() { MyInt = 2, MyString = "Str2" });
        list.Add(new MyClass() { MyInt = 3, MyString = "Str3" });

        // Assign list to replicator
        replicatorActivity1.InitialChildData = list;
    }

    private void ChildInitialized(object sender, ReplicatorChildEventArgs e)
    {
        // This is the activity that is initialized
        InvokeWorkflowActivity currentActivity = (InvokeWorkflowActivity)e.Activity;

        // This is the initial data
        MyClass initialData = (MyClass)e.InstanceData;

        // Setting the initial data to the activity
        InvokeWorkflowActivity1_MyInt = initialData.MyInt;
        InvokeWorkflowActivity1_MyString = initialData.MyString;
    }

    public class MyClass
    {
        public int MyInt { get; set; }
        public string MyString { get; set; }
    }
}

Ожидаемый результат следующий:

Invoke WF: Int = 1, String = Str1
Invoke WF: Int = 2, String = Str2
Invoke WF: Int = 3, String = Str3

Надеюсь, что это поможет вам.

1 голос
/ 02 февраля 2011

Я понимаю, что этот пост старый, но для тех, кто нашел его в Google с тем же вопросом, вам нужно сделать следующее:

  1. Оберните вызов InvokeWorkflow в пользовательское действие - это упростит сопоставление параметров. В этом действии создайте свойство DependencyProperty для каждого из свойств, которые вы хотите передать вызванному рабочему процессу. Давайте пока назовем это «InvokerActivity». Затем в InvokeWorkflowActivity сопоставьте свойства TargetWorkflow со свойствами зависимостей в InvokerActivity, как предлагает Panos выше. ПРИМЕЧАНИЕ: чтобы многоточие отображало объекты, они ДОЛЖНЫ быть конкретными типами. Если ваш объект является интерфейсом, вы не сможете отобразить его. Рабочий процесс не будет знать, как создать экземпляр объекта интерфейса.
  2. Поместите InvokerActivity в ReplicatorActivity, используя конструктор.
  3. ReplicatorActivity предоставляет обработчик событий с именем ChildInitialized. Создайте свой обработчик для этого события, и в нем вы получите ReplicatorChildEventArgs. В нем вы можете получать Activity через аргументы событий как таковые:

        InvokerActivity activity = (e.Activity as InvokerActivity);
        if (activity != null)
        {
            activity.MyParam = e.InstanceData as MyParamType;
        }
    

Теперь, когда вы запустите его, ReplicatorActivity будет вызывать этот метод один раз для каждого элемента в коллекции и будет передавать параметры для каждой из InvokerActivities, которые он вызовет.

e.InstanceData будет следующим объектом в коллекции, через которую реплицирует итерация.

0 голосов
/ 13 ноября 2008

Вы можете объявить два свойства в целевом рабочем процессе следующим образом:

    public static readonly DependencyProperty MyIntProperty =
        DependencyProperty.Register("MyInt", typeof(int), typeof(Workflow3));
    public static readonly DependencyProperty MyStringProperty =
        DependencyProperty.Register("MyString", typeof(string), typeof(Workflow3));

    public int MyInt
    {
        get { return (int)GetValue(MyIntProperty); }
        set { SetValue(MyIntProperty, value); }
    }

    public string MyString
    {
        get { return (string)GetValue(MyStringProperty); }
        set { SetValue(MyStringProperty, value); }
    }

После этого, если вы перейдете на вкладку Свойства InvokeWorkflowActivity, вы увидите два свойства в категории Parameters.

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

...