Расписание детей DynamicActivity, загружаемых из внешнего XAML с параметрами - PullRequest
2 голосов
/ 29 февраля 2012

Сценарий : я реализую родительское действие, которое выполняет другое действие из внешнего источника (базы данных), после этого Рон Джейкобс пост .

Этот подход работаетно у меня есть несколько проблем в моем случае, потому что WorkflowInvoker не получает родительские расширения:

  • Отслеживание отключено для детей
  • Мое пользовательское расширение для обмена данными не работает
  • Расширения могут меняться в зависимости от хоста, поэтому я не могу просто добавить новые снова.

Потенциальное решение : Вместо вызова дочернего XAML, я 'Я планирую это (я полагаю, это решит мои проблемы, верно?).

CacheMetadata: загрузить DynamicActivity из внешнего источника и вызвать metadata.AddChild(_childActivity);.

Затем выполнить:

    protected override void Execute(NativeActivityContext context)
    {
        context.ScheduleActivity(_childActivity, OnActivityComplete);
    }

И это сработало!Следующим шагом будет передача аргументов In, Out и InOut дочерним элементам.

Проблема : Как запланировать дочерние элементы DynamicActivity, загруженные из внешнего XAML со значениями InArgument, OutArgument и InOutArgument

Что-то, что я делаю, но работает только для OutArguments.В CacheMetadata я вызвал мой метод _childActivity.BindArguments

    public static void BindArguments(this DynamicActivity activity, IDictionary<string, Argument> argumentsToBind)
    {
        if (argumentsToBind == null)
            return;

        Type genericPropType, valueType, sourceArgumentType, vbReferenceType;
        Argument sourceArgument;
        foreach (var destinyArgument in activity.Properties)
        {
            if (!argumentsToBind.TryGetValue(destinyArgument.Name, out sourceArgument))
                continue;

            genericPropType = destinyArgument.Type.GetGenericTypeDefinition();
            if (genericPropType == typeof(InArgument<>))
            {
                destinyArgument.Value = new InArgument<string>("It worked! But I need the value from context which is unavaliable since I'm inside CacheMetadata");
            }
            else
            {
                valueType = destinyArgument.Type.GetGenericArguments()[0];
                sourceArgumentType = genericPropType.MakeGenericType(valueType);

                if (sourceArgument != null)
                {
                    vbReferenceType = typeof(VisualBasicReference<>).MakeGenericType(valueType);

                    object vbReference = Activator.CreateInstance(vbReferenceType,
                        GetExpressionText(sourceArgument, sourceArgumentType));

                    object referenceArgument = Activator.CreateInstance(sourceArgumentType, vbReference);

                    destinyArgument.Value = referenceArgument;
                }
            }
        }
    }

Итак , мне нужно передать InArguments и InOutArguments, но мне нужно значение из контекста, которое недоступно, так как явнутри CacheMetadata.

Я пытался установить DynamicActivityProperty.Value в методе Execute.Но это тоже не сработало.

После этого я основал эту страницу , которая может помочь вам понять мой сценарий.

1 Ответ

3 голосов
/ 01 марта 2012

Вместо того, чтобы делать все это, вы рассматривали передачу сообщений в дочерний рабочий процесс? Рабочие процессы, в которых размещаются другие рабочие процессы, не являются областью, которая хорошо поддерживается (как вы обнаружили). Вместо этого рабочие процессы, отправляющие сообщения другим рабочим процессам, кажутся лучшим подходом. Конечно, вы не можете поделиться трекингом и расширениями. Я придумал способ поддержки отслеживания в дочернем рабочем процессе, но он использует частное отражение.

...