2010-02-19 9 views
5

sono nuovo a Windows Workflow [WF] e sono interessati a valutare WF per scopi aziendali. Ho deciso di lavorare attraverso un introductionWF4RC, attività WriteLine genera errori su StringWriter assegnato a 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); 
} 

e incontrato

Metodo SomeTests.SomeTests.TestMethod ha gettato un'eccezione: System.Activities.InvalidWorkflowException: I seguenti errori sono stati riscontrati durante l'elaborazione della struttura del flusso di lavoro: 'Letterale': Literal supporta solo i tipi di valore e il tipo immutabile System.String. Il tipo System.IO.TextWriter non può essere utilizzato come letterale.

Poking in giro, ho trovato this article che descrive quello che sembra essere l'errore che vedo sopra.

Essendo nuovo in WF, non capisco il cambiamento o il metodo prescritto per aggirare il problema. Quindi, la mia domanda è,

Con WF4RC, come si usa [correttamente] l'attività WriteLine?

risposta

8

Ack, k, quindi nota mentale: tentare tutte le permutazioni di una ricerca su Google. Trovato this dopo la ricerca di

attività WriteLine WF RC

La soluzione è quella di avvolgerlo in un LambdaValue<T>, comme ça

[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()); 
} 

che sembra strano per me, ma sono letteralmente l'opposto di "esperto": P

Sarei felice di ricevere alternative se qualcuno le ha.

+0

Ho avuto un problema simile con il tentativo di impostare una stringa []. Il LambdaValue funzionava. Ma ho anche notato che se usi InArgument funziona anche, ed è probabilmente il modo in cui dovrebbe essere fatto. – TrueEddie

0

appena bloccato su di esso così ... qui il mio modesto parere

TextWriter è un InArgument come qualsiasi altro elemento delle attività (ad esempio, l'elemento di testo). Un InArgument viene calcolato nel contesto del flusso di lavoro (quindi utilizza di conseguenza ActivityContext per raccogliere il valore reale in questo flusso di lavoro).

Assegnando direttamente lo scrittore, esso viene automaticamente convertito in un oggetto di archiviazione con un'espressione letterale dietro di esso. I letterali sono parti più o meno costanti di un flusso di lavoro e pertanto non sono autorizzati a cambiare. L'eccezione ti dice di evitare di usare un tipo che cambierebbe stato.

L'utilizzo dell'attività di espressione LambdaValue consente di assegnare in ogni istanza del flusso di lavoro un (nuovo) writer. Il flusso di lavoro si aspetta che questo oggetto sia di natura temporanea fino al termine del flusso di lavoro.

Spero che questo chiarisca questo problema e non mi sono fatto un moroon.

Problemi correlati