ワークフローの複雑なデータの操作
公開日: 2016年7月
DynamicValue では、データ構造を作成、格納、および使用することができます。 このデータは再帰可能です。つまり、DynamicValue は他の DynamicValues を含むことができます。DynamicValue の合成規則は非常に単純です。そのプロパティは、再帰プロパティ バッグまたは JSON シリアル化形式と同じように、プリミティブ、配列、または他の DynamicValues とすることができます。DynamicValue は複合データのコンテナーおよび操作メカニズムの両方に対して、WF 用のファースト クラスのバインディング サーフェスを提供します。
DynamicValue のデータの格納方法
根本的には、DynamicValue はキーと値ペアの再帰リストであると考えることができます。 次の表に、単純な DynamicValue を示します。
名前 |
基になるプリミティブ データ型の値 |
---|---|
年齢 |
42 |
名前 |
John Doe |
前の表では、DynamicValue には 2 つのプロパティがあります。Age の値は 42 であり、Name の値は John Doe です。DynamicValue プロパティの名前は文字列であり、その値は次の一覧の任意の値、または null (Visual Basic では Nothing) とすることができます。 その他の型が DynamicValue に渡されると、例外がスローされます。
文字列
Int32
Double
Guid
ブール
DateTime
TimeSpan
IList<T>。ここで、T はこの一覧の型の 1 つです
IDictionary<string, T>。ここで、T はこの一覧の型の 1 つです
DynamicValue
DynamicValue はサポートされている型の一覧にあります。 つまり、DynamicValue の値は、次の表に示すように別の DynamicValue とすることができます。
名前 |
値 |
||||||
---|---|---|---|---|---|---|---|
顧客 |
|
||||||
会社 |
Contoso Corporation |
Customer には、その値として DynamicValue が含まれ、DynamicValue には Age および Name が含まれます。Name の値を参照するには、Customer/Name を使用できます。Customer/Name の値が参照され、まだ作成されていない場合、その値が追加されます。 これは upsert として参照されます。
DynamicValue は配列の概念もサポートしています。 配列は、DynamicValue の値として含まれているプリミティブ値のセットです。 ネストされた DynamicValue ではなく配列としての DynamicValue の概念的な主な違いは、配列の項目に名前がなく、インデックスによってアクセスされることです。 配列は異なる型を含むことができます。Numbers の配列値では、型は Int32 および Double です。Items の配列値では、値はネストされた DynamicValue および Int32 です。
名前 |
値 |
||||||||
---|---|---|---|---|---|---|---|---|---|
数字 |
|
||||||||
項目 |
|
DynamicValue でのアドレス値
値はパス表記を使用して DynamicValue から設定および取得されます。 パスは、特定のプロパティを指す Uri のような文字列で、構造をフラット化した表記と似ています。 パスは、プロパティの名前、文字列、またはかっこで囲んだ数値を使った配列値内の項目へのインデックスを使用して構成されます。
注意
DynamicValue のパスを操作する例については、DynamicValue Path Evaluator のサンプルを参照してください。DynamicValue Path Evaluator のサンプルでは、JSON を返す REST サービスのエンドポイントを入力し、DynamicValue および返されるデータのパスを操作してこれを理解することができます。
前のセクションでは、DynamicValue のいくつかの例を示しました。 最初の例は、次の表に示すように、2 つの値がある DynamicValue でした。
名前 |
値 |
---|---|
年齢 |
42 |
名前 |
John Doe |
1 つ目の値にアクセスするには、Age で構成されているパスを使用し、これによって値 42 が返されます。Name のパスは値 John Doe を返します。
前のセクションの 2 つ目の例には、次の表に示すようにいくつかのネストされた値が含まれていました。
名前 |
値 |
||||||
---|---|---|---|---|---|---|---|
顧客 |
|
||||||
会社 |
Contoso Corporation |
パス Customer は DynamicValue を返します (それ自体に 2 つの値が含まれています)。Company のパスは Contoso Corporation を返します。 ネストされた値にアクセスするために、/ を使用してプロパティを記述します。 この表記を使用して、パス Customer/Age は値 42 を返し、Customer/Name は John Doe を返します。
配列に格納された値にアクセスするため、パスでインデックスが使用されています。 次の表に、配列とネストされた DynamicValue の両方が含まれた、前のセクションの DynamicValues を示します。
名前 |
値 |
||||||||
---|---|---|---|---|---|---|---|---|---|
数字 |
|
||||||||
項目 |
|
前の表で表す DynamicValue では、Numbers のパスは最初の配列を返します。DynamicValue 配列はゼロ ベースであり、Numbers(0) は配列の最初の要素を返し、Numbers(3) は配列の 4 番目の要素を返します。Items は 2 番目の配列を返し、Items(0) は配列の最初の項目 (DynamicValue) を返します。 ネストされた DynamicArray の値にアクセスするために、プロパティ名と、配列を生成するパスとが組み合わされます。Items(0)/First は 4 を返し、Items(0)/Second は 5 を返します。
パスを使用して、複合データ構造を宣言して作成できます。 設計時点で既知の値を使用することも、実行時に値を動的にバインドすることもできます。 次の例に、住所がわかっている顧客の合成を表すパスと値のセットを示します。
パス |
値 |
---|---|
FirstName |
John |
LastName |
Doe |
Address/City |
Redmond |
Address/State |
WA |
前の表のパスと値により、次の表で表される DynamicValue が作成されます。
名前 |
値 |
||||||
---|---|---|---|---|---|---|---|
FirstName |
John |
||||||
LastName |
Doe |
||||||
住所 |
|
DynamicValue 型は、Parse 文字列を JSON に解析するために使用できる DynamicValue メソッドを提供します。 さらに、ParseDynamicValue 文字列を JSON に解析するためにワークフローで使用できる DynamicValue アクティビティがあります。
Http アクティビティも DynamicValue を理解できます。DynamicValue を Http* アクティビティの応答に割り当てると、結果が JSON として取得され、その結果を使用して DynamicValue が作成されます。DynamicValue を要求本文に渡すか、これを応答の内容として使用すると、適切なヘッダーが追加され、JSON が使用されていることが示されます。
ワークフローでの DynamicValue の使用
DynamicValue 型に加えて、Workflow Manager 1.0 はワークフローで DynamicValue を作成し、操作するアクティビティも提供します。
アクティビティ |
説明 |
引数 |
---|---|---|
DynamicValue インスタンスを作成します。 パスと値のディクショナリを入力として受け取り、DynamicValue を返します。 複数割り当ての手法を使用して DynamicValue を作成します (複数のパスと値を受け取ります)。 このアクティビティを使用して新しい DynamicValue を作成するか、既存の DynamicValue を変更できます。 |
InArgument<IDictionary<string,InArgument>> Properties InOutArgument<DynamicValue> Result |
|
指定されたパスによって表されるプロパティが DynamicValue に含まれている場合、true を返します |
InArgument<DynamicValue> Source InArgument<DynamicValue> PropertyName OutArgument<bool> Result |
|
DynamicValue から別の DynamicValue にプロパティをコピーします |
InArgument<IDictionary<string,string>> PropertyMapping InArgument<DynamicValue> Source OutArgument<DynamicValue> Result |
|
DynamicValue パスの子の数を返します |
InArgument<DynamicValue> Source OutArgument<int> Result |
|
1 つのパスと 1 つの値 (複数割り当てのセマンティクスなし) のみを渡す DynamicValue のインスタンスを作成します |
InArgument<string> PropertyName InArgument PropertyValue OutArgument<DynamicValue> Result |
|
SOAP メッセージから DynamicValue を作成します |
InArgument<DynamicValue> Headers InArgument<XElement> Value InArgument<MessageVersion> Version OutArgument<DynamicValue> Result |
|
特別な書式の DynamicValue から SOAP メッセージを作成します |
InArgument<string> Action InArgument<DynamicValue> Headers InArgument<DynamicValue> Body InArgument<MessageVersion> Version OutArgument<XElement> Result |
|
Creates a URI from a DynamicValue |
InArgument<DynamicValue> Options OutArgument<string> Result |
|
既存の DynamicValue の複数のプロパティを取得します。 DynamicValue があれば、ユーザーは 1 つのアクティビティを使用して (複数のパスを渡す) 複数のプロパティを問い合わせることができます。 |
InArgument<DynamicValue> Source InArgument<IDictionary<string,OutArgument>> Properties |
|
DynamicValue の 1 つのプロパティを取得します。ここで、T は前の一覧の型のいずれかです。 |
InArgument<DynamicValue> Source InArgument<string> PropertyName OutArgument<T> Result |
|
JSON 文字列を DynamicValue に解析します |
InArgument<string> JSON OutArgument<DynamicValue> Result |
DynamicValue の使用
DynamicValue およびサポートするアクティビティにより、ホストが不明な方法でデータを表し、操作することができます。 したがって、DynamicValue は任意のワークフロー ホストで使用できるワークフロー機能なので、Workflow Manager 1.0 に制限されません。WorkflowInvoker、WorkflowApplication、WorkflowServiceHost などのように、その他の既存の任意のワークフロー ホストと共に使用できます。
「DynamicValue を使用したワークフローの複雑なデータの操作」のサンプルは、この機能を WorkflowApplication で使用する方法を示しています。 「No text is specified for bookmark or legacy link '89435d1b-f316-4e02-84a9-971a32bb797d#BKMK_DynamicValueSamples'.」の他のいくつかのサンプルでは、DynamicValue を Workflow Manager 1.0 ワークフローで使用する方法を示しています。DynamicValue の使用方法はホストにかかわらず同じですが、データを DynamicValue に読み込む方法はホストにより異なります (たとえば、Workflow Manager 1.0 では、Http アクティビティを使用して Http 操作の結果として DynamicValue を作成することが一般的です)。
注意
Workflow Manager 1.0 のサンプルとその場所については、「Workflow Manager 1.0 のサンプル」を参照してください。