共用方式為


使用 CacheMetadata 公開數據

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

預設 CacheMetadata 行為

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

  • InArgument<T>OutArgument<T>InOutArgument<T> (泛型自變數):這些自變數會公開給運行時間,做為名稱與類型等於公開屬性名稱和類型的自變數、適當的自變數方向,以及某些驗證數據。

  • Variable 或其任何子類別:這些成員會公開給執行期作為公用變數。

  • Activity 或其任何子類別:這些成員在執行時被公開作為公用子活動。 藉由呼叫 AddImportedChild,傳入子活動,即可明確實作預設行為。

  • ActivityDelegate 或其任何子類別:這些成員會以公用委派物件的形式公開給執行時。

  • ICollection 類型Variable:集合中的所有元素都會在執行時以公用變數形式公開。

  • ICollection 的類型為 Activity:集合中的所有元素都會公開給執行階段作為公用子項。

  • ICollection 類型 ActivityDelegate:集合中的所有元素都會以公用委派的形式暴露給執行階段。

衍生自 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 公開實作子系

若要使用變數將數據傳遞至活動所要排程的子活動,必須將變數新增為實作變數;public 變數不能以這種方式設定其值。 這是因為活動應該更多地被執行為函式的實作(具有參數),而非封裝類別(具有屬性)。 不過,在某些情況下,必須明確設定參數,例如使用 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);
    }
}