2010-02-19 3 views
5

Я новичок в Windows Workflow [WF], и заинтересован в оценке WF для деловых целей. Я решил работать через introductionWF4RC, функция WriteLine вызывает ошибку в StringWriter, назначенной TextWriter

[TestMethod] 
public void TestMethod() 
{ 
    TextWriter writer = new StringWriter(); 
    Sequence sequence = new Sequence 
    { 
     Activities = 
     { 
      // so, assigning a reference type [eg StringWriter] 
      // as target is prohibited in WF4RC. what or how do 
      // i assign a target? introduction cited above may 
      // not be current [ie may be Beta2, not RC] so ... ? 
      new WriteLine { Text = "Hello", TextWriter = writer }, 
      new WriteLine { Text = "World", TextWriter = writer } 
     } 
    }; 
    // !!! BLOWS UP !!! 
    WorkflowInvoker.Invoke (sequence); 
} 

и столкнулся с

Метод испытания SomeTests.SomeTests.TestMethod бросило исключение: System.Activities.InvalidWorkflowException: Следующие ошибки были обнаружены при обработке дерева рабочего процесса: 'Literal': Literal поддерживает только типы значений и неизменяемый тип System.String. Тип System.IO.TextWriter не может использоваться как литерал.

Покопавшись, я нашел this article, описывая, что является ошибкой, которую я вижу выше.

Будучи новым для WF, я действительно не понимаю изменения или предписанный метод, чтобы обойти его. Итак, мой вопрос:

С WF4RC, как [правильно] использовать WriteLine?

ответ

8

Ack, k, so mental note: Попытка всех перестановок поиска Google. Найдено this после поиска

WriteLine деятельности WF RC

Решение, чтобы обернуть его в LambdaValue<T>, Comme ча

[TestMethod] 
public void TestMethod() 
{ 
    StringWriter writer = new StringWriter(); 
    Sequence sequence = new Sequence 
    { 
     Activities = 
     { 
      new WriteLine 
      { 
       Text = "Hello", 
       TextWriter = new LambdaValue<TextWriter> (n => writer) 
      }, 
      new WriteLine 
      { 
       Text = "World", 
       TextWriter = new LambdaValue<TextWriter> (n => writer) 
      } 
     } 
    }; 
    WorkflowInvoker.Invoke (sequence); 
    Assert. 
     AreEqual (
     "Hello\r\nWorld\r\n", 
     writer.GetStringBuilder().ToString()); 
} 

, который кажется странным для меня, но я буквально напротив «эксперта»: P

Я по-прежнему приветствую альтернативы, если у кого их есть.

+0

У меня была аналогичная проблема с попыткой установить строку []. Работал LambdaValue . Но я также заметил, что если вы используете InArgument , он также работает, и, вероятно, так оно и должно быть сделано. – TrueEddie

0

просто застрял над ним, а ... вот мое скромное мнение

TextWriter является InArgument, как и любой другой элемент активности (например, текстовый элемент). InArgument вычисляется в контексте рабочего процесса (поэтому, следовательно, он использует ActivityContext для сбора реального значения в этом рабочем процессе).

Поскольку вы назначаете автора напрямую, он автоматически преобразуется в InArgument с выражением Literal за ним. Литералы являются более или менее постоянными частями рабочего процесса и поэтому не могут меняться. Исключение указывает, что вам следует избегать использования типа, состояние которого изменилось.

Использование функции выражения LambdaValue позволяет назначать в каждом экземпляре рабочего процесса запись (новый). Рабочий процесс ожидает, что этот объект будет носить временный характер до завершения рабочего процесса.

Надеюсь, что это прояснит этот вопрос, и я не сделал себе мороза.