2010-02-19 10 views
5

Jestem nowy w Workflow systemu Windows [WF] i zainteresowany oceną WF w celach biznesowych. Postanowiłem działać poprzez introductionWF4RC, aktywność WriteLine generuje błąd w StringWriter przypisany do 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); 
} 

i napotkał

Metoda badawcza SomeTests.SomeTests.TestMethod wyrzucił wyjątek: System.Activities.InvalidWorkflowException: Następujące błędy wystąpiły podczas przetwarzania drzewa workflow: 'Literal': Literal obsługuje tylko typy wartości i niezmienny typ System.String. Typ System.IO.TextWriter nie może być używany jako literał.

Kręcąc się, znalazłem this article opisujący to, co wydaje się być błędem, które widzę powyżej.

Będąc nowicjuszem w WF, nie bardzo rozumiem zmianę lub zalecaną metodę obejścia tego problemu. Tak, moje pytanie brzmi:

Z WF4RC, w jaki sposób jedna [poprawnie] używa aktywności WriteLine?

Odpowiedz

8

Ack, k, więc uwaga: próba wszystkich permutacji wyszukiwarki Google. Znaleziono this po wyszukaniu

aktywności WriteLine WF RC

Rozwiązaniem jest owinąć go w LambdaValue<T>, comme ca

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

co wydaje się dziwne dla mnie, ale jestem dosłownie przeciwieństwo "eksperta": P

Nadal będę mile widziane alternatywy, jeśli ktoś je ma.

+0

Miałem podobny problem z próbą ustawienia ciągu []. Przetworzył się LambdaValue . Ale zauważyłem również, że jeśli użyjesz InArgument , to również działa i prawdopodobnie tak powinno być. – TrueEddie

0

właśnie tkwi nad nim, jak również ... tutaj moja skromna opinia

TextWriter jest InArgument jak każdy inny element działalności (na przykład element tekstowy). InArgument jest obliczany w kontekście przepływu pracy (dlatego konsekwentnie korzysta z ActivityContext do gromadzenia rzeczywistej wartości w tym przepływie pracy).

Przypisując pisarz bezpośrednio, jest on automatycznie konwertowany na InArgument z wyrażeniem literalnym za nim. Literały są mniej więcej stałymi częściami przepływu pracy i dlatego nie mogą się zmieniać. Wyjątek mówi, aby unikać używania typu, który zmieni się.

Używanie aktywności wyrażenia LambdaValue umożliwia przypisanie w każdym wystąpieniu przepływu pracy (nowego) programu piszącego. Przepływ pracy oczekuje, że ten obiekt będzie tymczasowy, dopóki przepływ pracy się nie skończy.

Mam nadzieję, że to wyjaśni tę kwestię i nie zrobiłem sobie maroon.

Powiązane problemy