시나리오를 사용하여 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을 설립했습니다.
내 중요한 포인트는 인프라 목적을 위해 회사 ID가있는 데이터 공유 확장 프로그램이었고이 ID가 필요했습니다. 확장 인스턴스를 다시 전달하는 결과가 발생했습니다. 어쨌든,이 경우에 In/InOutArgument를 적절하게 인스턴스화하는 방법을 잘 알고 있듯이 WF4 및 커뮤니티가 LoadAndInvokeWorkflow의 공유 가능 버전을 공유하는 것이 가능하다고 생각합니다 (주로 추적 및 지속성) 그리고 LoadAndInvokeWorkflow에서 자식이 더 자연스럽고 잘 보일 것입니다. –
확장 프로그램 공유를 지원하고 싶지만, 유감스럽게도 지정된 워크 플로 호스트에서 확장 프로그램을 열거 할 방법이 없습니다. 커버 아래에서 그것은 간단한 컬렉션도 아니다. 값을 전달할 수 있도록 API를 변경할 수 있다고 생각합니다. 좋은 생각 일 수 있습니다. –
나는 당신이하고 싶은 것을 이해합니다. 상위 확장을 반복하고 하위에 추가합니다. 내 생각은 조금 다르다. XAML 하위 작업의 일정을 계획하고 메타 데이터를 캐싱하면 잘 알려진 하위 항목에서이를 전환하고 동일한 컨텍스트에서 실행되어 확장 '공유'가 허용됩니까? –