アクティビティを実行する前に、ワークフロー ランタイムは、実行を維持するために必要なアクティビティに関するすべての情報を取得します。 ワークフロー ランタイムは、 CacheMetadata メソッドの実行中にこの情報を取得します。 このメソッドの既定の実装では、実行時にアクティビティによって公開されるすべてのパブリック引数、変数、および子アクティビティがランタイムに提供されます。アクティビティがこれよりも多くの情報をランタイムに提供する必要がある場合 (プライベート メンバー、アクティビティによってスケジュールされるアクティビティなど)、このメソッドをオーバーライドして提供できます。
CacheMetadata の既定の動作
CacheMetadataから派生したアクティビティのNativeActivityの既定の実装では、次の方法で次のメソッド型が処理されます。
InArgument<T>、 OutArgument<T>、または InOutArgument<T> (ジェネリック引数): これらの引数は、公開されているプロパティの名前と型、適切な引数の方向、およびいくつかの検証データと同じ名前と型を持つ引数としてランタイムに公開されます。
Variable またはそのサブクラス: これらのメンバーは、パブリック変数としてランタイムに公開されます。
Activity またはそのサブクラス: これらのメンバーはパブリックの子アクティビティとしてランタイムに公開されます。 既定の動作は、 AddImportedChildを呼び出して子アクティビティを渡すことによって明示的に実装できます。
ActivityDelegate またはそのサブクラス: これらのメンバーは、パブリック デリゲートとしてランタイムに公開されます。
ICollection 型 Variable: コレクション内のすべての要素は、パブリック変数としてランタイムに公開されます。
ICollection 型 Activity: コレクション内のすべての要素は、ランタイムにパブリックな子要素として公開されます。
ICollection 型 ActivityDelegate: コレクション内のすべての要素は、パブリック デリゲートとしてランタイムに公開されます。
CacheMetadata、Activity、およびCodeActivityから派生するアクティビティのAsyncCodeActivityは、次の違いを除き、上記と同様に機能します。
Activityから派生したクラスは、子アクティビティまたはデリゲートをスケジュールできないため、そのようなメンバーはインポートされた子およびデリゲートとして公開されます。
CodeActivityおよびAsyncCodeActivityから派生するクラスは、変数、子、またはデリゲートをサポートしていないため、引数のみが公開されます。
CacheMetadata をオーバーライドしてランタイムに情報を提供する
次のコード スニペットは、 CacheMetadata メソッドの実行中に、アクティビティのメタデータにメンバーに関する情報を追加する方法を示しています。 メソッドのベースは、アクティビティに関するすべてのパブリック データをキャッシュするために呼び出されることに注意してください。
protected override void CacheMetadata(NativeActivityMetadata metadata)
{
base.CacheMetadata(metadata);
metadata.AddImplementationChild(this._writeLine);
metadata.AddVariable(this._myVariable);
metadata.AddImplementationVariable(this._myImplementationVariable);
RuntimeArgument argument = new RuntimeArgument("MyArgument", ArgumentDirection.In, typeof(SomeType));
metadata.Bind(argument, this.SomeName);
metadata.AddArgument(argument);
}
CacheMetadata を使用して実装の子を公開する
変数を使用してアクティビティによってスケジュールされる子アクティビティにデータを渡すには、変数を実装変数として追加する必要があります。パブリック変数の値をこのように設定することはできません。 その理由は、アクティビティは、カプセル化されたクラス (プロパティを持つ) ではなく、(パラメーターを持つ) 関数の実装として実行されることを意図しているためです。 ただし、スケジュールされたアクティビティは子アクティビティと同様に親アクティビティの引数にアクセスできないため、 ScheduleActivityを使用する場合など、引数を明示的に設定する必要がある場合があります。
次のコード スニペットは、 CacheMetadataを使用してネイティブ アクティビティからスケジュールされたアクティビティに引数を渡す方法を示しています。
public sealed class ChildActivity : NativeActivity
{
public WriteLine _writeLine;
public InArgument<string> Message { get; set; }
private Variable<string> MessageVariable { get; set; }
public ChildActivity()
{
MessageVariable = new Variable<string>();
_writeLine = new WriteLine
{
Text = new InArgument<string>(MessageVariable),
};
}
protected override void CacheMetadata(NativeActivityMetadata metadata)
{
base.CacheMetadata(metadata);
metadata.AddImplementationVariable(this.MessageVariable);
metadata.AddImplementationChild(this._writeLine);
}
protected override void Execute(NativeActivityContext context)
{
string configuredMessage = context.GetValue(Message);
context.SetValue(MessageVariable, configuredMessage);
context.ScheduleActivity(this._writeLine);
}
}
.NET