Как ActivityContext, LocationReferenceEnvironment, Arguments и Variables работают в WF4?

Я понимаю, что управление потоком и контекст разделены в WF4, но я спрашиваю вас, как я могу контролировать контекст данного рабочего процесса.

WorkflowApplication имеют свойство HostEnvironment, которое согласно документации получает или устанавливает корневую среду для аргументов и переменных экземпляра рабочего процесса.

В чем разница между LocationReferenceEnvironment и самим ActivityContext? Кто создает и контролирует контекст? Насколько я понимаю, каждое действие имеет свой собственный контекст, но, например, не все действия имеют переменные.

Мне нужен максимальный контроль над контекстом данного рабочего процесса, но у меня проблемы с пониманием внутренней работы всего этого. Может ли кто-нибудь объяснить мне это и / или указать мне несколько хороших статей, желательно с точки зрения программирования. К сожалению, MSDN, а точнее .NET Framework Class Library, в хорошей документации WF4 не хватает.


person Joao    schedule 26.04.2011    source источник


Ответы (1)


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

По сути, ссылка на местоположение - это место для хранения данных, что-то, что отображается переменной в вашем рабочем процессе. По умолчанию вы можете добавлять переменные только к составным действиям. Здесь нет никаких технических причин, просто переменная используется для обмена данными между несколькими действиями, поэтому добавление их в действие, у которого нет дочерних элементов или только одно, вам ничего не даст. Тем не менее, вы можете делать это в своей деятельности, если хотите.

Что вы пытаетесь сделать, чтобы максимально контролировать контекст деятельности?

Обновление. Не уверен, что это помогает, но вот как вы можете создавать выражения VB в коде:

var wf = new Sequence()
{
    Variables =
    {
        new Variable<string>("var1", "Some value"),
        new Variable<int>("var2", c=> Environment.TickCount),
    },
    Activities =
    {
        new WriteLine() {
            Text = new VisualBasicValue<string>("\"String value: \" & var1 ")
        },
        new WriteLine() {
            Text = new VisualBasicValue<string>("\"Int value: \" & var2 ")
        }

    }
};

WorkflowInvoker.Invoke(wf);
person Maurice    schedule 26.04.2011
comment
Проблема больше, чем это. Я пишу API определения рабочего процесса и хочу использовать WF4 / CLR в качестве движка. Перевод из API в WF4 оказывается невозможным в отношении переменных и аргументов. Я уже описал свою проблему здесь. Я решил задать новый вопрос в поисках некоторой ценной информации, потому что, похоже, никто не может помочь мне в моей первоначальной (и более крупной) проблеме. Может ты мне поможешь :) Я борюсь с этим неделями. - person Joao; 26.04.2011
comment
Потрясающие! Это совершенно новый взгляд на проблему. Еще раз, VisualBasicValue недостаточно документирован, но я обязательно рассмотрю его. Просто уберите эти вопросы с моего пути: какой VisualBasicValue обеспечивает доступ к переменным через их имя, верно? Почему вы используете ActivityContext на var2, а не на var1? Я пытался удалить этот параметр, и он работал точно так же. - person Joao; 26.04.2011
comment
Еще один вопрос. Это нормальный способ: Text = new InArgument<string>(c => String.Format("String value: {0}", var1.Get(c))). Почему VisualBasicValue не нужен контекст? Где он берет ссылки? - person Joao; 26.04.2011
comment
Разница между var1 и var2 заключается только в том, что var1 - это фиксированное значение, известное заранее, а var2 - это лямбда, которая загружает значение по запросу. Ни в том, ни в другом случае я не использую контекст. VisualBasicValue анализирует выражение и оценивает любые переменные в нем, я предполагаю, что он использует для этого внутренний контекст. И да, он использует имена переменных, а не ссылку. - person Maurice; 26.04.2011
comment
Можно ли использовать эти кастомные классы? Получите доступ к свойствам этих настраиваемых классов. Кажется, он поддерживает только типы значений, я прав? - person Joao; 26.04.2011
comment
Переменные могут содержать любой допустимый тип .NET. Они не ограничиваются типами значений. - person Maurice; 26.04.2011
comment
@Maurice Использование собственных классов не кажется простым делом, по крайней мере, так, как я думаю об их использовании. Я открыл новый вопрос по этой теме. Вы можете это проверить? Вы, кажется, один из немногих, кто может на него ответить. Заранее спасибо. - person Joao; 27.04.2011