2010-12-02 3 views
2

Как я могу динамически установить значения переменных из родительской области в операции Windows Workflow Foundation в .NET 4?Динамическая настройка переменных во внешней области действия WF 4

Попытка это не удалось (падение на последовательности активности на рабочем процессе, где последовательность имеет переменную INT с именем Test):

public sealed class CodeActivity1 : NativeActivity 
{ 
    protected override void CacheMetadata(NativeActivityMetadata metadata) 
    { 
     _locationReferences = 
      metadata.Environment.GetLocationReferences().ToList(); 

     base.CacheMetadata(metadata); 
    } 

    protected override void Execute(NativeActivityContext context) 
    { 
     LocationReference locationReference = 
      _locationReferences.Find(
       x => x.Name == "Test" && x.Type == typeof (int)); 

     if (locationReference != null) 
     { 
      Console.WriteLine(
       locationReference.Name + " " + locationReference.Type); 

      // Blows up here. 
      Location location = locationReference.GetLocation(context); 
      location.Value = 5; 
     } 
    } 

    private List<LocationReference> _locationReferences; 
} 

Это приводит к:

System.InvalidOperationException был необработанный по коду пользователя
Message = Activity '1.2: CodeActivity1' не может получить доступ к этой переменной, так как объявлен в сфере деятельности '1.1: Последовательность'. Активность может только получить доступ к ее собственной реализации переменных.

Он находит переменную; он просто не может получить или установить свою ценность.

Имя переменной («Тест» в приведенном выше примере) не будет известно до времени выполнения.

ответ

6

Обычный способ обработки этого объекта - определить OutArgument, а в дизайнере рабочего процесса привязать OutArgument к вашей переменной. В действии вы работаете только с аргументом. Использование NativeActivity дает вам OutArgument с именем Result, но просто добавление свойства OUtArgument будет прекрасно.

Другим преимуществом является то, что вам не нужно знать имена переменных «магия» для хранения результатов в.

Update, так как код в комментарии ниже неразборчивое.

Попробуйте добавить следующее прямо перед линией она взрывается:

var pi = context.GetType().GetProperty("AllowChainedEnvironmentAccess", BindingFlags.NonPublic | BindingFlags.Instance); 
pi.SetValue(context, true, null); 

Полностью не поддерживается, так что используйте с осторожностью :-)

+0

У меня есть требование, чтобы клиенты не имеют жёстко знания рабочий процесс. Мы привыкли к BPM, где вы можете создать процесс, передав имена, пары значений, чтобы инициализировать поля, опросить запущенный процесс, чтобы получить список полей, а затем установить их и т. Д. Это более гибко, доступно для обнаружения и развязано на стоимость безопасности во время работы. Переход от BPM к WF - это переход от динамически типизированного языка к статически типизированному языку. Я думаю, у нас есть два варианта: подделать его с переменной типа Dictionary или опросить WSDL. – TrueWill 2010-12-03 15:52:19

Смежные вопросы