Сценарием: Я осуществляет родительскую деятельность, которая выполняет иную деятельность от внешнего источника (базы данных), после этого Ron Jacobs post.Расписания дети DynamicActivity загружается из внешнего XAML с параметрами
Этот подход работает, но есть несколько проблем, в моем случае, потому что WorkflowInvoker не получает родительские расширения:
- Tracking отключен для детей
- Моих пользовательских данных обмена расширения не работает
- Расширения могут меняться в зависимости от хоста, поэтому я не могу просто добавить новые.
Потенциальное решение: Вместо Призовите детей 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 тоже, но мне нужно значение из контекста, который Unavaliable, так как я внутри CacheMetadata.
Я попытался установить DynamicActivityProperty.Value
в методе Execute
. Но это тоже не сработало.
После этого я основал this page, что может помочь вам понять мой сценарий.
Моей критической точкой было расширение данных, которое имело companyId для целей инфраструктуры, и мне был нужен этот идентификатор. Я закончил повторный экземпляр расширения. В любом случае, поскольку вы точно знаете, как правильно создать In/InOutArgument в этом случае, я думаю, что вполне возможно сделать и подумать, что было бы здорово, если бы WF4 и сообщество имели расширение, совместимое с версией LoadAndInvokeWorkflow (в основном потому, что отслеживание и настойчивость) и запланировать, чтобы ребенок в LoadAndInvokeWorkflow выглядел более естественным, а просто моя точка зрения.Большое спасибо за помощь –
Я хотел бы поддерживать расширение общего доступа, но, к сожалению, нет способа перечислить расширения в данном узле рабочего процесса. Под обложками это тоже не простая коллекция. Полагаю, я мог бы изменить API, чтобы позволить вам передавать значения ... может быть, хорошая идея. –
Я понимаю, что вы хотели. Итерации над родительскими расширениями и добавление потом к детям, правильно? Моя идея была немного иной. Считаете ли вы, что планирование (и кеширование метаданных) дочерней активности XAML превратит его в хорошо известных детей и будет выполнено в том же контексте, что позволит расширять «совместное использование»? –