2

入力引数を受け入れて結果を返す、シリアル化可能なフローチャート Windows ワークフローをプログラムで定義する必要があります。デザイナーを使用してこれらのワークフローを作成する方法は理解していますが、コードで作成し、フローチャート ワークフローをシリアル化できるようにする必要があります (したがって、ラムダ式はありません)。

Assign の「To」フィールドを取得できません。以下のコードは、WriteLine とそれに続く Assign のフローチャート ワークフローを作成します。

var ab = new ActivityBuilder<string> {
    Name = "ActivityBuilt",
    Implementation = new Flowchart {
        StartNode = new FlowStep {
            Action = new WriteLine { Text = new VisualBasicValue<string>("greeting") },
            Next = new FlowStep {
                Action = new Assign {
                    DisplayName = "Set result",
                    To = new OutArgument<string>(new VisualBasicReference<string> { 
                        ExpressionText = "results"}),
                    Value = new VisualBasicValue<string>("bye")
                }
            }
        }
    }
};

ab.Properties.Add(new DynamicActivityProperty {
    Name = "greeting", 
    Type = typeof (InArgument<string>),  
    Value = "hello"});
ab.Properties.Add(new DynamicActivityProperty {
    Name = "results",  
    Type = typeof (OutArgument<string>), 
    Value = "bye"});

// Convert the ActivityBuilder to a callable activity
using (var sw = new StringWriter()) {
    using (var xw = ActivityXamlServices.CreateBuilderWriter(new XamlXmlWriter(sw, new XamlSchemaContext()))) {
        XamlServices.Save(xw, LastCreated);
    }

    using (var sr = new StringReader(sw.ToString())) {
         var wf = ActivityXamlServices.Load(sr);
         return wf;
    }
}

上記のコードは、「テキスト 'bye' から 'OutArgument' を作成できませんでした」というメッセージを表示して、ActivityBuilder から Activity に変換しようとすると失敗します。これは、OutArgument を使用せずに渡すだけで問題なく動作します。

私の質問は、To プロパティに何を入れるかです。ActivityBuilder.Properties に追加した OutArgument を参照するにはどうすればよいですか? VisualBasicReference は OutArgument ではありません。これを必要以上に難しくしていませんか?

ヒントをありがとう!

編集:プログラムでワークフローを作成したい。ワークフローには入力引数があり、結果を返す必要があります (出力引数)。

ワークフローを作成する方法と、入力引数を宣言して使用する方法を理解しています。ActivityBuilder を使用してワークフローを作成し、ActivityBuilder のプロパティを介して InArgument を設定しています。XAML にシリアル化し、ActivityXamlServices.Load を使用して逆シリアル化することで、ActivityBuilder からワークフローを作成します。

私が理解していないのは、ワークフローから結果を取得する方法です。OutArgument が含まれていると思います。ワークフローに OutArgument を追加する方法/場所は? 私が提供したコード スニペットは OutArgument に値を割り当てると思っていましたが、ActivityXamlServices.Load の呼び出しが失敗し、OutArgument を作成できないというエラーが表示されます。

  • ActivityBuilder を使用するアプローチは正しいですか?
  • Assign アクションの「To」フィールドは OutArgument を適切に参照していますか?
  • ActivityBuilder に OutArgument を認識させ、アクティビティ / ワークフローに変換できるようにするにはどうすればよいですか?

これで私の問題が明確になることを願っています。

4

1 に答える 1

4

コードには少なくとも3つの問題があります。

  1. Assignの値はInArgument()である必要があります。
  2. 読み込もうとしている値の名前は、「さようなら」ではなく「挨拶」です。
  3. 「results」という名前のOutArgumentにデフォルト値を設定することはできません。

次のコードを試してください。

var ab = new ActivityBuilder<string>
{
    Name = "ActivityBuilt",
    Implementation = new Flowchart
    {
        StartNode = new FlowStep
        {
            Action = new WriteLine { Text = new VisualBasicValue<string>("greeting") },
            Next = new FlowStep
            {
                Action = new Assign
                {
                    DisplayName = "Set result",
                    To = new OutArgument<string>(new VisualBasicReference<string>
                    {
                        ExpressionText = "results"
                    }),
                    Value = new InArgument<string>(new VisualBasicValue<string>("greeting"))
                }
            }
        }
    }
};

ab.Properties.Add(new DynamicActivityProperty
{
    Name = "greeting",
    Type = typeof(InArgument<string>),
    Value = "hello"
});
ab.Properties.Add(new DynamicActivityProperty
{
    Name = "results",
    Type = typeof(OutArgument<string>)
});

// Convert the ActivityBuilder to a callable activity
using (var sw = new StringWriter())
{
    using (var xw = ActivityXamlServices.CreateBuilderWriter(new XamlXmlWriter(sw, new XamlSchemaContext())))
    {
        XamlServices.Save(xw, ab);
    }

    using (var sr = new StringReader(sw.ToString()))
    {
        var wf = ActivityXamlServices.Load(sr);
        WorkflowInvoker.Invoke(wf);
    }
}
于 2011-06-08T19:58:29.013 に答える