5

Windows Workflow [WF]を初めて使用し、ビジネス目的でWFを評価することに関心があります。紹介をすることにしました

[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:ワークフローツリーの処理中に次のエラーが発生しました:'リテラル':リテラルは値型と不変型System.Stringのみをサポートします。タイプSystem.IO.TextWriterをリテラルとして使用することはできません。

ざっと見てみると、上記のエラーのように見えるものを説明しているこの記事を見つけました。

WFに慣れていないので、それを回避するための変更や規定された方法を本当に理解していません。だから、私の質問は、

WF4RCでは、どのように[正しく]WriteLineアクティビティを使用しますか?

4

2 に答える 2

8

Ack、k、so mental note:Google検索のすべての順列を試してください。検索した後にこれを見つけました

WriteLineアクティビティWFRC

LambdaValue<T>解決策は、それを、commecaで包むことです。

[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

誰かがそれらを持っているなら、私はまだ代替案を歓迎します。

于 2010-02-19T19:45:18.043 に答える
0

それにもこだわった...ここに私の謙虚な意見

TextWriterは、アクティビティの他の要素(Text要素など)と同様にInArgumentです。InArgumentは、ワークフローのコンテキストで計算されます(したがって、ActivityContextを使用して、このワークフローの実際の値を収集します)。

ライターを直接割り当てると、ライターは自動的にリテラル式を背後に持つInArgumentに変換されます。リテラルはワークフローのほぼ一定の部分であるため、変更することはできません。例外は、状態が変化するタイプの使用を避けるように指示します。

LambdaValue式アクティビティを使用すると、ワークフローの各インスタンス化で(新しい)ライターを割り当てることができます。ワークフローは、ワークフローが終了するまで、このオブジェクトが一時的な性質のものであることを期待しています。

これがこの問題を明らかにすることを願っています、そして私は自分自身をモロンにしませんでした。

于 2011-04-19T21:01:30.727 に答える