Сценарий : я реализую родительское действие, которое выполняет другое действие из внешнего источника (базы данных), после этого Рон Джейкобс пост .
Этот подход работаетно у меня есть несколько проблем в моем случае, потому что 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
.Но это тоже не сработало.
После этого я основал эту страницу , которая может помочь вам понять мой сценарий.