2

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

ответ

3

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

+0

Моей критической точкой было расширение данных, которое имело companyId для целей инфраструктуры, и мне был нужен этот идентификатор. Я закончил повторный экземпляр расширения. В любом случае, поскольку вы точно знаете, как правильно создать In/InOutArgument в этом случае, я думаю, что вполне возможно сделать и подумать, что было бы здорово, если бы WF4 и сообщество имели расширение, совместимое с версией LoadAndInvokeWorkflow (в основном потому, что отслеживание и настойчивость) и запланировать, чтобы ребенок в LoadAndInvokeWorkflow выглядел более естественным, а просто моя точка зрения.Большое спасибо за помощь –

+0

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

+0

Я понимаю, что вы хотели. Итерации над родительскими расширениями и добавление потом к детям, правильно? Моя идея была немного иной. Считаете ли вы, что планирование (и кеширование метаданных) дочерней активности XAML превратит его в хорошо известных детей и будет выполнено в том же контексте, что позволит расширять «совместное использование»? –