Наследование рабочего процесса Dynamics CRM с выходными параметрами

#c# #dynamics-crm

#c# #dynamics-crm

Вопрос:

Я унаследовал проект CRM с несколькими рабочими процессами, которые выполняют очень похожие задачи, в основном они получают входную строку и выводят значение OptionSet для этой строки. Поскольку нам нужен новый рабочий процесс для каждого набора опций, я надеюсь улучшить много дублированного кода. Я решил создать абстрактный класс

 public abstract class MyBaseWorkflow : CodeActivity
{
    protected sealed override void Execute(CodeActivityContext executionContext)
    {
        // this is pseudo-code and I know it works, the last line is the issue
        var input = ReadInputValue();
        var query = BuildQuery();
        var option = MatchWithInput(queryResults, input);
        WriteToOutput(..., option);
    }

    protected string BuildQuery();
    protected string ReadInputValue();
    protected string WriteToOutput(CodeActivityContext executionContext, OptionMetadata selectedValue);
}
  

затем в моих рабочих процессах у меня есть (я опустил BuildQuery и ReadInputValues, поскольку я знаю, что они работают просто отлично)

 public class MyWorkflow : MyBaseWorkflow
{

    [Input("Account MyFieldAsText Input")]
    public InArgument<string> OptionSetStringInput { get; set; }
 
    [Output("Account MyFieldOptionSetValue Output")]
    [AttributeTarget("account", "myField")]
    public OutArgument<OptionSetValue> OptionSetValueOutput { get; set; }

    protected overide string WriteToOutput(CodeActivityContext executionContext, OptionMetadata selectedValue)
    { 
        this.OptionSetValueOutput.Set(executionContext, new OptionSetValue(selectedValue.Value.Value));
    }
}
  

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

Я думал о том, чтобы сделать что-то вроде этого: context.OutputParameters["myField"] = selectedValue посмотреть, устанавливает ли это значение, но я не уверен, как это сделать.

Есть идеи, что может пойти не так?
Имеют ли выходные параметры какие-либо ограничения при наследовании?
Должен ли я избегать наследования, как правило, при работе с рабочими процессами и плагинами?

Ответ №1:

Не ищите OutArgument значения в IPluginExecutionContext объекте. Аргументы Out принадлежат домену Windows Workflow Foundation. Вы можете найти их в пользовательском интерфейсе, когда добавляете действие в свой рабочий процесс в том месте, где вы добавили пользовательское действие.

Коллекция выходных параметров используется для плагинов.