2

시나리오를 사용하여 DynamicActivity를로드하십시오. 시나리오 : 외부 소스 (데이터베이스)의 다른 작업을 실행하는 부모 작업을 구현하고 있습니다 (Ron Jacobs post).자식을 예약하십시오.

WorkflowInvoker 부모 확장하지 않기 때문에이 방법을하지만, 내 경우에는 몇 가지 문제가 작품 :

  • 추적 어린이를위한
  • 작동하지 않습니다 확장을 공유
  • 내 사용자 정의 데이터를 사용할 수 없습니다를
  • 확장 기능은 호스트에 따라 달라질 수 있으므로 새로운 기능을 다시 추가 할 수는 없습니다.

잠재적 인 솔루션 대신 호출 자식 XAML의 , 나는 그것을 예약 해요 (I, 바로 내 문제를 해결할 생각?).

CacheMetadata : 외부 소스에서 DynamicActivity을로드하고 metadata.AddChild(_childActivity);으로 전화하십시오.

그런 다음 실행 :

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

그리고 그것은했다! 다음 단계는 In, Out 및 InOut 인수를 자식에게 전달하는 것입니다.

문제 : InArgument, OutArgument와 외부 XAML 에서로드 어린이 DynamicActivity 예약 및 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 내부 때죠되어 사용할 수 없습니다 상황에서 값을 필요로 내 방법이라고합니다.

Execute 방법으로 설정하려고했습니다. 하지만 효과가 없습니다.

후, 나는 내 시나리오를 이해하는 데 도움이 될 this page을 설립했습니다.

답변

3

이 모든 작업을 수행하는 대신 메시지를 하위 워크 플로로 전달하는 것이 고려 되었습니까? 다른 워크 플로를 호스팅하는 워크 플로는 잘 지원되는 영역이 아닙니다. 대신 워크 플로가 다른 워크 플로에 메시지를 보내는 것이 더 나은 방법 인 것 같습니다. 물론 추적 및 광고 확장을 공유 할 수는 없습니다. 나는 하위 작업 흐름에서 추적을 지원하는 방법을 생각해 냈지만 사적인 리플렉션을 사용합니다.

+0

내 중요한 포인트는 인프라 목적을 위해 회사 ID가있는 데이터 공유 확장 프로그램이었고이 ID가 필요했습니다. 확장 인스턴스를 다시 전달하는 결과가 발생했습니다. 어쨌든,이 경우에 In/InOutArgument를 적절하게 인스턴스화하는 방법을 잘 알고 있듯이 WF4 및 커뮤니티가 LoadAndInvokeWorkflow의 공유 가능 버전을 공유하는 것이 가능하다고 생각합니다 (주로 추적 및 지속성) 그리고 LoadAndInvokeWorkflow에서 자식이 더 자연스럽고 잘 보일 것입니다. –

+0

확장 프로그램 공유를 지원하고 싶지만, 유감스럽게도 지정된 워크 플로 호스트에서 확장 프로그램을 열거 할 방법이 없습니다. 커버 아래에서 그것은 간단한 컬렉션도 아니다. 값을 전달할 수 있도록 API를 변경할 수 있다고 생각합니다. 좋은 생각 일 수 있습니다. –

+0

나는 당신이하고 싶은 것을 이해합니다. 상위 확장을 반복하고 하위에 추가합니다. 내 생각은 조금 다르다. XAML 하위 작업의 일정을 계획하고 메타 데이터를 캐싱하면 잘 알려진 하위 항목에서이를 전환하고 동일한 컨텍스트에서 실행되어 확장 '공유'가 허용됩니까? –