2010-12-02 1 views
3

Setting internal properties in composite WF4 Activities at design time에 대한 후속 질문입니다."활동은 자신이 소유 한 인수 위치 만 가져올 수 있습니다."

일부 속성이 미리 정의되어있는 Receive 및 SendReply 활동이 포함 된 복합 Windows 워크 플로 활동 (.NET 4)을 만들고 있습니다. 이것은 활동 템플리트가 아닌 NativeActivity입니다. (예는 위의 질문에 @Maurice's reply를 참조하십시오.)

을 나는 (부모의 컨텍스트를 사용하여) 실행에서 내부 SendReply와 관련된 InArgument를 설정하려고하면, 내가 할 InvalidOperationException이 :

활동을 자신이 소유 한 인수의 위치 만 가져올 수 있습니다. 액티비티 'CreateInstance'가 'SendReply'액티비티에서 소유하고있는 'Parameter0' 인수의 위치를 ​​얻으려고합니다.

제 경우에는 CorrelationHandle을 설정하려고하는데, 이것이 SendParametersContent Parameters에도 영향을 미친다 고 생각합니다. 이 문제를 어떻게 해결할 수 있습니까?

답변

4

여기에는 입력 인수를 변수에 저장하고 응답에서 사용하고 CorrelationHandle을 설정하는 CacheMetadata의 업데이트 버전이 있습니다. AddImplementationChild를 사용하여 액티비티가 추가되므로 기본 트릭은 AddImplementationVariable을 사용하여 변수를 변수로 추가하는 것입니다.

protected override void CacheMetadata(NativeActivityMetadata metadata) 
{ 
    _receive = _receive ?? new Receive(); 
    _sendReply = _sendReply ?? new SendReply(); 
    _receive.CanCreateInstance = true; 
    metadata.AddImplementationChild(_receive); 
    metadata.AddImplementationChild(_sendReply); 

    _receive.ServiceContractName = ServiceContractName; 
    _receive.OperationName = OperationName; 

    var correlationHandle = new Variable<CorrelationHandle>("correlationHandle"); 
    metadata.AddImplementationVariable(correlationHandle); 
    var correlationInitializer = new RequestReplyCorrelationInitializer() 
    { 
     CorrelationHandle = new InArgument<CorrelationHandle>(correlationHandle) 
    }; 
    _receive.CorrelationInitializers.Add(correlationInitializer); 


    var firstName = new Variable<string>("firstName"); 
    metadata.AddImplementationVariable(firstName); 
    var args = new ReceiveParametersContent(); 
    args.Parameters["firstName"] = new OutArgument<string>(firstName); 
    _receive.Content = args; 


    _sendReply.Request = _receive; 
    var results = new SendParametersContent(); 
    results.Parameters["greeting"] = new InArgument<string>(new VisualBasicValue<string>("\"Hello \" & firstName")); 
    _sendReply.Content = results; 

    base.CacheMetadata(metadata); 
} 
+0

우수; 고맙습니다! Execute 메서드에서 액세스 할 수 있도록 일반 Variables 개인 필드를 만들었습니다. Set (context, correlationHandle)이 작동하지 않는다는 것을 발견했습니다. "Handle 하위 유형의 변수에서 연산을 수행 할 수 없습니다." CorrelationHandle이 성공한 InArgument가되도록 논리를 수정했습니다. (RequestReply보다는 QueryCorrelationInitializer를 사용하고 있습니다.) – TrueWill

+0

이것은 4.5에서 변경된 것 같습니다. 두려운 "한 명 이상의 어린이에게 유효성 검사 오류가 있습니다." –

관련 문제