使用 CacheMetadata 公開資料

執行活動之前,工作流程執行階段會取得維持其執行作業所需的所有活動相關資訊。 工作流程執行階段會在 CacheMetadata 方法執行期間取得這項資訊。 此方法的預設實作會為執行階段提供活動執行時所公開的所有公用引數、變數和子活動。如果活動需要提供更多資訊給執行階段 (例如私用成員或要由活動排程的其他活動),您就可以覆寫此方法以提供這些資訊。

預設 CacheMetadata 行為

衍生自 CacheMetadata 之活動 NativeActivity 的預設實作會以下列方式處理下列方法類型:

  • InArgument<T>OutArgument<T>InOutArgument<T> (泛型引數):這些引數會公開至執行階段當做引數 (其名稱和型別等於公開的屬性名稱和型別)、正確的引數方向和一些驗證資料。

  • Variable 或其任何子類別:這些成員會公開至執行階段當做公用變數。

  • Activity 或其任何子類別:這些成員會公開至執行階段當做公用子活動。 您可以透過呼叫 AddImportedChild 並傳入子活動,明確實作預設行為。

  • ActivityDelegate 或其任何子類別:這些成員會公開至執行階段當做公用委派。

  • 型別為 ICollectionVariable:集合中的所有項目都會公開至執行階段當做公用變數。

  • 型別為 ICollectionActivity:集合中的所有項目都會公開至執行階段當做公用子系。

  • 型別為 ICollectionActivityDelegate:集合中的所有項目都會公開至執行階段當做公用委派。

衍生自 CacheMetadataActivityCodeActivity 之活動的 AsyncCodeActivity 也會依照上述方式運作,不過具有下列差異:

  • 衍生自 Activity 的類別無法排程子活動或委派,因此這類成員會公開成匯入的子系和委派。

  • 衍生自 CodeActivityAsyncCodeActivity 的類別不支援變數、子系或委派,因此只會公開引數。

覆寫 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);
    }
}