Избегайте «Деятельность может получить только местоположение аргументов, которыми она владеет». - PullRequest
3 голосов
/ 02 декабря 2010

Это дополнительный вопрос к Настройка внутренних свойств в составном WF4 Действия во время разработки .

Я создаю составную активность рабочего процесса Windows (в .NET 4), которая содержит действия получения и отправки с некоторыми предопределенными свойствами. Это NativeActivity, а не шаблон действия. (См. @ ответ Мориса на приведенный выше вопрос для примера.)

Если я пытаюсь установить InArgument, связанный с внутренним SendReply, из Execute (используя родительский контекст), я получаю исключение InvalidOperationException:

Деятельность может получить только местоположение аргументов, которыми он владеет. Деятельность CreateInstance пытается получить расположение аргумента 'Parameter0' который принадлежит деятельности 'SendReply'.

В моем случае я пытаюсь установить CorrelationHandle, но я верю, что это также повлияет на параметры SendParametersContent. Как я могу обойти это?

1 Ответ

4 голосов
/ 03 декабря 2010

Вот обновленная версия CacheMetadata, которая сохраняет входной аргумент в переменной, использует его в ответе и устанавливает CorrelationHandle. Основной трюк состоит в том, чтобы добавить их как переменную с помощью AddImplementationVariable, поскольку действия добавляются с использованием AddImplementationChild.

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);
}
...